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;
}