BZOJ1413: [ZJOI2009]取石子游戏

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

Sample Output

0

数据范围
对于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;
}

 

posted @ 2018-07-28 23:00  符拉迪沃斯托克  阅读(198)  评论(0编辑  收藏  举报
Live2D