POJ1740|A NEW STONE GAME|博弈论

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

分析:大神说是构造博弈Orz……其实看大神题解之后觉得不难。

从简单开始,首先,一堆的话先手必胜。

如果有两堆,则只有两堆相同的时候先手会输。若两堆不同,先手可以造成两堆相同的局面从而不输。

如果有三堆,先手可以拿走一堆并制造两堆相同的情况。

我们发现,将n堆石子排序,如果石子数量对称,即每种数量的石子有偶数堆,则先手必输。因为先手并不能取光所有的,而后手只要模仿先手的行为就能一直有石子可取。

继续推理,我们会发现只有这种情况先手会输。

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,a[11];
int main()
{
    while (scanf("%d",&n))
    {
        if (n==0) return 0;
        for (int i=1; i<=n; i++) scanf("%d",&a[i]);
        if (n%2==1) printf("1\n");
        else
        {
             int i;
             sort(a+1,a+n+1);
             for (i=1; i<=n;i +=2)
                 if (a[i]!=a[i+1]) { printf("1\n"); break; }
             if (i>n) printf("0\n");
        }
  }}
时间: 2024-10-05 18:24:25

POJ1740|A NEW STONE GAME|博弈论的相关文章

poj1740 A New Stone Game(博弈)

A New Stone Game Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 5028   Accepted: 2753 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

poj1740 A New Stone Game

题意:对于n堆石子,每堆若干个,两人轮流操作,每次操作分两步,第一步从某堆中去掉至少一个,第二步(可省略)把该堆剩余石子的一部分分给其它的某些堆. 真是好♂题,代码不长就是好♂题. 首先考虑两堆相同的石子,先手一定必输,因为若是我操作第一堆,则后手也可以对第二堆做对称决策. 其实,其他情况,一定是先手必胜. 第一种情况:奇数堆. 我们可以将最大堆的石子分配给其他堆让他们两两配对,如下图所示: 显然,红色部分绝壁不会超过第五个 石子的高度. 第二种情况:偶数情况 我们可以把最大堆和最小堆先配对,剩

Codeforces - 1191D - Tokitsukaze, CSL and Stone Game - 博弈论

https://codeforces.com/contest/1191/problem/D 好像在哪里见过类似的? 相当于在棋盘上面移动棋子,每次只能左移一格,移动完之后有棋子重叠或本身就是不能移动就输. 那么只有一颗棋子的情况,判断奇偶就行. 当有多颗棋子,假如检测到某两颗棋子重叠,那么左边那颗棋子立刻左移一位并break,重新检测,要是没有重叠则可以继续,否则一开始就是输的. 然后大家就尽可能地把棋子往左边挪,明显挪的次数是恒定的,和策略没有任何关系.只和棋子之间的空格的总和的奇偶性有关.

codeforces1191D Tokitsukaze, CSL and Stone Game 博弈论

网址:http://codeforces.com/problemset/problem/1190/B 题意: 给出n堆石头,两个人轮流从非空的石头堆中取一颗石头,如果某人开始前,石头已经被取完,或者取了之后,出现两堆石头数量相同,则输,假设两个人每次都会走最佳选择,求最后谁会赢. 题解: 结论:在自己取石头之后,石头堆是0,1,2,3......n-1时,必胜,故两方一定是想办法构造成这个样子.然后是特殊情况,如果已经有两个空堆,或者三堆相同,或者两堆相同且存在一堆比这堆少一个(5,5,4->5

博弈论类题目小结——转载

出处http://blog.csdn.net/ACM_cxlove?viewmode=contents    by---cxlove 首先当然要献上一些非常好的学习资料: 基础博弈的小结:http://blog.csdn.net/acm_cxlove/article/details/7854530 经典翻硬币游戏小结:http://blog.csdn.net/acm_cxlove/article/details/7854534 经典的删边游戏小结:http://blog.csdn.net/acm

博弈论之Nim

博弈论(一):Nim游戏 重点结论:对于一个Nim游戏的局面(a1,a2,...,an),它是P-position当且仅当a1^a2^...^an=0,其中^表示位异或(xor)运算. Nim游戏是博弈论中最经典的模型(之一?),它又有着十分简单的规则和无比优美的结论,由这个游戏开始了解博弈论恐怕是最合适不过了. Nim游戏是组合游戏(Combinatorial Games)的一种,准确来说,属于“Impartial Combinatorial Games”(以下简称ICG).满足以下条件的游戏

poj1737~poj1744——ltc男人八题

准备开刷这充满神秘感的八道题,虽然我不是男的... 完成度:3/8 2016.7.~?   poj1742 Coins 题意:给你n种面值的硬币和每种硬币的数量.求1~m中有多少个可以用这些硬币组成. 算法:dp 解析:dp[i][j]表示用前i中硬币组成j时第i种硬币剩余的枚数(若不能组成j则为-1) 考虑以下四种情况: (1)若dp[i-1][j]>=0,则无需第i种硬币,为c[i] (2)若val[i]>j,面值太大,则为-1 (3)若dp[i][j-val[i]]<=0,无法组成

【poj1740】 A New Stone Game

http://poj.org/problem?id=1740 (题目链接) 男人八题之一 题意:对于n堆石子,每堆若干个,两人轮流操作,每次操作分两步,第一步从某堆中去掉至少一个,第二步(可省略)把该堆剩余石子的一部分分给其它的某些堆.最后谁无子可取即输. Solution  首先我们考虑两堆相等的情况,一定是谁取谁输,因为对方永远可以做对称的操作.对于四堆,1.2堆相等,3.4堆相等的情况,一定也是先手输,后手也只需要做对称的操作(在先手取石子的对称堆中取相同多的石子,并把和先手等量的石子分给

博弈论(男人八题):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