码迷,mamicode.com
首页 > 其他好文 > 详细

【POJ1740】A New Stone Game 构造博弈

时间:2015-01-10 18:18:22      阅读:145      评论:0      收藏:0      [点我收藏+]

标签: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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!