BZOJ1115: [POI2009]石子游戏Kam

1115: [POI2009]石子游戏Kam

Time Limit: 10 Sec  Memory Limit: 162 MB
Submit: 500  Solved: 308
[Submit][Status]

Description

有N堆石子,除了第一堆外,每堆石子个数都不少于前一堆的石子个数。两人轮流操作每次操作可以从一堆石子中移走任意多石子,但是要保证操作后仍然满足初始时的条件谁没有石子可移时输掉游戏。问先手是否必胜。

Input

第一行u表示数据组数。对于每组数据,第一行N表示石子堆数,第二行N个数ai表示第i堆石子的个数(a1<=a2<=……<=an)。 1<=u<=10 1<=n<=1000 0<=ai<=10000

Output

u行,若先手必胜输出TAK,否则输出NIE。

Sample Input

2
2
2 2
3
1 2 4

Sample Output

NIE
TAK

HINT

感谢MT大牛翻译.

Source

题解:

考虑将问题转化到阶梯NIM上来。

首先初始 i 格可以移掉的石子数 为 a[i]-a[i-1]

事实上,若我们从 i 处取走了 x 个石子,那么下一次及以后就可以在 i+1 处多取 x 个,相当于 把 i 处的 x 个石子加到了 i+1处。

问题就转化成了阶梯NIM。

orz

代码:

 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<cmath>
 4 #include<cstring>
 5 #include<algorithm>
 6 #include<iostream>
 7 #include<vector>
 8 #include<map>
 9 #include<set>
10 #include<queue>
11 #include<string>
12 #define inf 1000000000
13 #define maxn 1005
14 #define maxm 500+100
15 #define eps 1e-10
16 #define ll long long
17 #define pa pair<int,int>
18 #define for0(i,n) for(int i=0;i<=(n);i++)
19 #define for1(i,n) for(int i=1;i<=(n);i++)
20 #define for2(i,x,y) for(int i=(x);i<=(y);i++)
21 #define for3(i,x,y) for(int i=(x);i>=(y);i--)
22 #define mod 1000000007
23 using namespace std;
24 inline int read()
25 {
26     int x=0,f=1;char ch=getchar();
27     while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();}
28     while(ch>=‘0‘&&ch<=‘9‘){x=10*x+ch-‘0‘;ch=getchar();}
29     return x*f;
30 }
31 int n,cs,ans,a[maxn];
32 int main()
33 {
34     freopen("input.txt","r",stdin);
35     freopen("output.txt","w",stdout);
36     cs=read();
37     while(cs--)
38     {
39         n=read();
40         for1(i,n)a[n+1-i]=read();a[n+1]=0;
41         ans=0;
42         for1(i,n)if(i&1)ans^=a[i]-a[i+1];
43         if(ans)printf("TAK\n");else printf("NIE\n");
44     }
45     return 0;
46 }

时间: 2024-10-03 14:02:55

BZOJ1115: [POI2009]石子游戏Kam的相关文章

【博弈论】bzoj1115 [POI2009]石子游戏Kam

差分后与阶梯博弈很类似. #include<cstdio> using namespace std; int n,T,a[1001],ans; int main() { scanf("%d",&T); for(;T;--T) { ans=0; scanf("%d",&n); for(int i=1;i<=n;++i) scanf("%d",&a[i]); for(int i=n;i>=1;i-=2)

【BZOJ1115】[POI2009]石子游戏Kam 阶梯博弈

[BZOJ1115][POI2009]石子游戏Kam Description 有N堆石子,除了第一堆外,每堆石子个数都不少于前一堆的石子个数.两人轮流操作每次操作可以从一堆石子中移走任意多石子,但是要保证操作后仍然满足初始时的条件谁没有石子可移时输掉游戏.问先手是否必胜. Input 第一行u表示数据组数.对于每组数据,第一行N表示石子堆数,第二行N个数ai表示第i堆石子的个数(a1<=a2<=……<=an). 1<=u<=10 1<=n<=1000 0<=

BZOJ 1115: [POI2009]石子游戏Kam

1115: [POI2009]石子游戏Kam Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 924  Solved: 574[Submit][Status][Discuss] Description 有N堆石子,除了第一堆外,每堆石子个数都不少于前一堆的石子个数.两人轮流操作每次操作可以从一堆石子中移走任意多石子,但是要保证操作后仍然满足初始时的条件谁没有石子可移时输掉游戏.问先手是否必胜. Input 第一行u表示数据组数.对于每组数据,第一行

【BZOJ 1115】 [POI2009]石子游戏Kam

1115: [POI2009]石子游戏Kam Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 551  Solved: 339 [Submit][Status] Description 有N堆石子,除了第一堆外,每堆石子个数都不少于前一堆的石子个数.两人轮流操作每次操作可以从一堆石子中移走任意多石子,但是要保证操作后仍然满足初始时的条件谁没有石子可移时输掉游戏.问先手是否必胜. Input 第一行u表示数据组数.对于每组数据,第一行N表示石子堆数

bzoj 1115: [POI2009]石子游戏Kam -- 博弈论

1115: [POI2009]石子游戏Kam Time Limit: 10 Sec  Memory Limit: 162 MB Description 有N堆石子,除了第一堆外,每堆石子个数都不少于前一堆的石子个数.两人轮流操作每次操作可以从一堆石子中移走任意多石子,但是要保证操作后仍然满足初始时的条件谁没有石子可移时输掉游戏.问先手是否必胜. Input 第一行u表示数据组数.对于每组数据,第一行N表示石子堆数,第二行N个数ai表示第i堆石子的个数(a1<=a2<=……<=an). 1

【bzoj1115】[POI2009]石子游戏Kam(博弈论)

题目传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=1115 观察问题,我们能发现前后相邻两堆石子的数量差一定非负,而我们在第i堆石子中移走k个石子,那么第i堆与第i-1堆石子的数量差就减少k,第i+1堆与第i堆的数量差增加k.这样就转化为了一个经典的博弈论游戏:阶梯游戏.我们把第i堆石子移走k个,那么就相当于把阶梯上第i堆与第i-1堆石子的差那一级移k个石子到第i+1堆与第i堆的差那一级上(往下移一级).于是就有一个结论:阶梯游戏的结果

BZOJ 1115 [POI2009]石子游戏Kam(阶梯博弈)

[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1115 [题目大意] 有N堆石子,除了第一堆外,每堆石子个数都不少于前一堆的石子个数. 两人轮流操作每次操作可以从一堆石子中移走任意多石子, 但是要保证操作后仍然满足初始时的条件谁没有石子可移时输掉游戏.问先手是否必胜. [题解] 我们定义最后一堆以及下标与其相差为偶数的堆为偶堆石子,其余的为奇堆石子, 我们发现不管奇堆石子做什么操作,只要在偶堆石子中做相应的操作就可以抵消, 因此决定

[BZOJ 1115] [POI2009] 石子游戏Kam 【阶梯博弈】

题目链接:BZOJ - 1115 题目分析 首先看一下阶梯博弈: 阶梯博弈是指:初始有 n 堆石子,每次可以从任意的第 i 堆拿若干石子放到第 i - 1 堆.最终不能操作的人失败. 解法:将奇数位的石子堆做最基本的 NIM 就可以了. WHY:对奇数位做 NIM 的必胜者总是可以胜利,因为如果从奇数位拿石子到偶数位,就相当于把这些石子拿走了,就是 NIM :如果必败者从偶数位将石子拿到奇数位,必胜者总是可以将这些石子再向前移一个位置,就又放到了偶数位,这样一直移动的话,最终会是必胜者将这些石子

BZOJ 1115: [POI2009]石子游戏Kam (阶梯nim)

Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1138  Solved: 697[Submit][Status][Discuss] Description 有N堆石子,除了第一堆外,每堆石子个数都不少于前一堆的石子个数.两人轮流操作每次操作可以从一堆石子中移走任意多石子,但是要保证操作后仍然满足初始时的条件谁没有石子可移时输掉游戏.问先手是否必胜. Input 第一行u表示数据组数.对于每组数据,第一行N表示石子堆数,第二行N个数ai表示第i堆石