标签: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 构造博弈
标签:poj1740 a new stone game 构造 博弈
原文地址:http://blog.csdn.net/vmurder/article/details/42583257