首页 > 代码库 > 【POJ1740】A New Stone Game 构造博弈

【POJ1740】A New Stone Game 构造博弈

题意:多组数据,每组数据一个先n,然后给出n堆石子的数目。

两人轮流操作,每次可以从某数量为xi的石子堆中扔掉k个石子(k∈[1,xi]),然后剩余xi-k个,可以把g个石子随意分给其他堆(不能凭空建堆出来,g∈(0,xi-k))。


题解:

首先构造平衡状态:

有偶数堆,且可以两两配对。

这样可以理解为先手玩一下,后手可以有同样的应对策略。(脑洞开一下就好了,这不是难点少年)


那么如何构造平衡状态呢?

考虑如果总数是奇数,那么有下图。

技术分享

然后如果总数是偶数,那么有下两图。

图一为我们先将石子排序,然后最高的放到左边

技术分享

图二就是配对方式。(到这其实就很水了)

技术分享

但是如果刚开始就是平衡的那就没招了,先手只能输了。

呃,只能说可以发现

好了,可以看代码了:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define N 15
using namespace std;
int stone[N],n;
int main()
{
//	freopen("test.in","r",stdin);
	int i,j,k;
	while(scanf("%d",&n),n)
	{
		for(i=1;i<=n;i++)scanf("%d",&stone[i]);
		if(n&1)puts("1");
		else {
			sort(stone+1,stone+n+1);
			bool flag=1;
			for(i=1;i<n;i+=2)flag&=(stone[i]==stone[i+1]);
			if(flag)puts("0");
			else puts("1");
		}
	}
	return 0;
}


【POJ1740】A New Stone Game 构造博弈