【POJ1740】A New Stone Game 构造博弈

来源:互联网 发布:淘宝官换机靠谱吗 编辑:程序博客网 时间:2024/04/30 00:47

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

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


题解:

首先构造平衡状态:

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

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


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

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


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

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


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


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

呃,只能说可以发现

好了,可以看代码了:

#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#define N 15using 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;}


1 0
原创粉丝点击