BZOJ1413: [ZJOI2009]取石子游戏
Description
在研究过Nim游戏及各种变种之后,Orez又发现了一种全新的取石子游戏,这个游戏是这样的:
有n堆石子,将这n堆石子摆成一排。
游戏由两个人进行,两人轮流操作,每次操作者都可以从最左或最右的一堆中取出若干颗石子,可以将那一堆全部取掉,但不能不取,不能操作的人就输了。
Orez问:对于任意给出一个初始一个局面,是否存在先手必胜策略。
Input
文件的第一行为一个整数T,表示有 T组测试数据。
对于每组测试数据,第一行为一个整数n,表示有n堆石子;第二行为n个整数ai,依次表示每堆石子的数目。
Output
对于每组测试数据仅输出一个整数0或1。
其中1表示有先手必胜策略,0表示没有。
Sample Input
1
4
3 1 9 4
4
3 1 9 4
Sample Output
0
数据范围
对于30%的数据 n≤5 ai≤10^5
对于100%的数据 T≤10 n≤1000 每堆的石子数目≤10^9
数据范围
对于30%的数据 n≤5 ai≤10^5
对于100%的数据 T≤10 n≤1000 每堆的石子数目≤10^9
题解Here!
懒得再写了,分类讨论真复杂。。。
正解戳这里。
当然,还有一种骚操作,至今没有想出来为什么。。。
如果有哪位大神知道为什么,请留步,并回复!
附代码:
#include<iostream> #include<algorithm> #include<cstdio> #include<cmath> #define MAXN 100010 using namespace std; int n,val[MAXN]; inline int read(){ int date=0,w=1;char c=0; while(c<'0'||c>'9'){if(c=='-')w=-1;c=getchar();} while(c>='0'&&c<='9'){date=date*10+c-'0';c=getchar();} return date*w; } void work(){ if(abs(val[1]-val[n])<=1)printf("0\n"); else printf("1\n"); } void init(){ n=read(); for(int i=1;i<=n;i++)val[i]=read(); } int main(){ int t=read(); while(t--){ init(); work(); } return 0; }