POJ 1740 A New Stone Game

A New Stone Game

Time Limit: 1000MS   Memory Limit: 30000K
Total Submissions: 5453   Accepted: 2989

Description

Alice and Bob decide to play a new stone game.At the beginning of the game they pick n(1<=n<=10) piles of stones in a line. Alice and Bob move the stones in turn. 
At each step of the game,the player choose a pile,remove at least one stones,then freely move stones from this pile to any other pile that still has stones. 
For example:n=4 and the piles have (3,1,4,2) stones.If the player chose the first pile and remove one.Then it can reach the follow states. 
2 1 4 2 
1 2 4 2(move one stone to Pile 2) 
1 1 5 2(move one stone to Pile 3) 
1 1 4 3(move one stone to Pile 4) 
0 2 5 2(move one stone to Pile 2 and another one to Pile 3) 
0 2 4 3(move one stone to Pile 2 and another one to Pile 4) 
0 1 5 3(move one stone to Pile 3 and another one to Pile 4) 
0 3 4 2(move two stones to Pile 2) 
0 1 6 2(move two stones to Pile 3) 
0 1 4 4(move two stones to Pile 4) 
Alice always moves first. Suppose that both Alice and Bob do their best in the game. 
You are to write a program to determine who will finally win the game.

Input

The input contains several test cases. The first line of each test case contains an integer number n, denoting the number of piles. The following n integers describe the number of stones in each pile at the beginning of the game, you may assume the number of stones in each pile will not exceed 100. 
The last test case is followed by one zero.

Output

For each test case, if Alice win the game,output 1,otherwise output 0.

Sample Input

3
2 1 3
2
1 1
0

Sample Output

1
0

Source

[email protected]

分析引自: http://www.cnblogs.com/rainydays/archive/2011/07/09/2101918.html

题意:对于n堆石子,每堆若干个,两人轮流操作,每次操作分两步,第一步从某堆中去掉至少一个,第二步(可省略)把该堆剩余石子的一部分分给其它的某些堆。

最后谁无子可取即输。

分析:首先我们考虑两堆相等的情况,一定是谁取谁输,因为对方永远可以做对称的操作。对于四堆,1、2堆相等,3、4堆相等的情况,一定也是先手输,后手也只需要做对称的操作(在先手取石子的对称堆中取相同多的石子,并把和先手等量的石子分给先手分配给的堆的对称堆。(若先手在3堆取,并分给1堆,那后手就在4堆取,分给2堆)。也就是说对于任意的一对一对相等的情况来说,一定是后手必胜。

我们接下来来证明除上述情况外,所有情况都是先手必胜。因为任何一种情况都可以转化为一对一对相等的情况。若总堆数为奇数的情况,可以把石子最多的一堆的石子分配给其它堆,使得其它堆两两相等。最多一堆的石子绝对是足够多,可以完成这个补齐的任务的。因为我们把石子从小到大排序后画成条形统计图。把相邻两个分成一组(1和2一组,3和4一组……)我们需要用第n堆填补1,3,5……堆我们把需要填补的这些差距(2比1高出的部分,4比3高出的部分……)投影到统计图左侧的y轴上,我们会发现这是一些不连续的区间,其长度总和明显小于第n堆。所以可以补齐。

对于堆数为偶数的情况。我们把最多的一堆削弱到和最少的一堆一样多,并把拿掉的石子分给别的堆,使其一对一对地相等。可行性于前面奇数情况同理。

所以只要判断是不是一对一对的相等的情况即可。

 1 /*by SilverN*/
 2 #include<iostream>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<cstdio>
 6 #include<cmath>
 7 using namespace std;
 8 bool f[1200];
 9 int cnt;
10 int num;
11 int n;
12 int main(){
13     while(scanf("%d",&n) && n){
14         memset(f,false,sizeof f);
15         cnt=0;
16         for(int i=1;i<=n;i++){
17             scanf("%d",&num);
18             if(f[num])cnt--;
19             else cnt++;
20             f[num]=!f[num];//状态取反
21         }
22         if(cnt)    printf("1\n");
23         else printf("0\n");
24     }
25     return 0;
26 }
时间: 2024-10-10 17:03:36

POJ 1740 A New Stone Game的相关文章

POJ 1740 A New Stone Game(博弈)题解

题意:有n个石子堆,每一个都可以轮流做如下操作:选一个石堆,移除至少1个石子,然后可以把这堆石子随便拿几次,随便放到任意的其他石子数不为0的石子堆,也可以不拿.不能操作败. 思路:我们先来证明,如果某个石子数有偶数堆,则先手必败,因为无论先手怎么做,后手都能模仿先手,最后把石子取光.显然全是偶数堆是必败态.如果有奇数堆怎么办?我们就把最大的奇数堆取光,然后把其他奇数堆变成偶数堆.但是一定能保证可以吗?答案是可以.假设奇数堆的石子数为 x1,x2,x3...xn,那么我们分别给每一堆加上x2-x1

poj 1740 A New Stone Game nim变形

题意: 给n堆石子,两人交替,选择一堆石头后先拿去任意颗,再把剩下的放到其他任意堆,最先拿完所有石子赢,问先手必胜还是必败. 分析: 解决此类问题的一种的思路是先构造策略,然后判断此策略能否满足1.必胜态可到必败态.2.必败态无法到必败态. 代码: //poj 1740 //sep9 #include <iostream> #include <algorithm> using namespace std; const int maxN=128; int a[maxN]; int m

POJ 1740 A New Stone Game 又是博弈论配对找规律orz 博弈论 规律

http://poj.org/problem?id=1740 这个博弈一眼看上去很厉害很高大上让人情不自禁觉得自己不会写,结果又是找规律-- 博弈一般后手胜都比较麻烦,但是主要就是找和先手的对应关系,依然看了题解-- 如果所有石头堆两两配对的话后手对先手的每一步都可以对应走一步,那么此时后手必胜. 如果不是两两配对,先手可以通过一次操作使石头堆两两配对,此时的两两配对局面面对的是后手,所以先手必胜. 不是两两配对时的操作:首先将所有非配对推按大小排序(只有一堆直接取没就可以了): 然后显然不配对

POJ 1740 A New Stone Game(博弈)

A New Stone Game Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 6586 Accepted: 3611 Description Alice and Bob decide to play a new stone game.At the beginning of the game they pick n(1<=n<=10) piles of stones in a line. Alice and Bob mov

博弈论(男人八题):POJ 1740 A New Stone Game

A New Stone Game Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 5694   Accepted: 3119 Description Alice and Bob decide to play a new stone game.At the beginning of the game they pick n(1<=n<=10) piles of stones in a line. Alice and Bob

POJ 1740 A New Stone Game(多堆博弈找规律)

传送门 //有n堆,AB轮流从n堆的一堆中移任意个,可以扔掉,也可以移给其他堆中的一堆 //最先移完的胜 //如果n堆中两两堆数目相等,那肯定是B胜 //但只要有非两两相同的,如xyz,A先, //A可以从最多的那堆(z)移y-x个到x堆,yyp,最终移走p的一定是A #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; i

[原博客] POJ 1740 A New Stone Game

题目链接题意:有n堆石子,两人轮流操作,每次每个人可以从一堆中拿走若干个扔掉(必须),并且可以从中拿走一些分到别的有石子的堆里(可选),当一个人不能拿时这个人输.给定状态,问是否先手必胜. 我们参考普通取石子游戏可知,如果只有一堆,先手必胜.如果有两堆一样,先手必败,对称博弈,第一个人怎么取,第二个人也可以怎么取,直到第一个人无法取为止.如果有四堆两两一样,还是先手必败,第一个人无论如何取,第二个人可以再次取成两两一样.如果有2*k堆两两一样,还是先手必败.注意:除了上述情况,都是先手必胜.因为

POJ 1740

这题,通过多次试验,可以发现,当只存在两堆(以下称对)相等的石子时,先手必输.更进一步,当N对这样的石子存在时,先手必输. 于是,若1要赢,一种方法是,把石子都变成相等的对. 考虑石子中无对的情况,若存在对,我们把那些对忽略,因为先手对于这些对是必输的. 当N为奇数时,随机考虑这样的情况(有序)a<b<c<d<e.可知,先手必定能把这些石子变成对.因为e>=(b-a)+(d-c),只需从e中取走若干后把剩余的分配即可. 当N为偶数时,考虑a<b<c<d<

POJ 1740:A New Stone Game

A New Stone Game Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 5113 Accepted: 2806 Description Alice and Bob decide to play a new stone game.At the beginning of the game they pick n(1<=n<=10) piles of stones in a line. Alice and Bob mov