首页 > 代码库 > 【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 构造博弈
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。