【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;
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值