zoukankan      html  css  js  c++  java
  • 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
    ");
        else printf("1
    ");
    }
    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;
    }
    
  • 相关阅读:
    centos7修改网卡名称
    xtrabackup备份恢复过程
    centos 设置删除提示
    cetos6 安装samba共享文件夹
    centos 安装cacti监控
    centos6 搭建hdwiki
    centos6.8安装superctl 后台管理工具
    centos6.5 安装ansible,管理多台服务器
    CreateParams作用及重写
    c# 获取当前应用程序的路径
  • 原文地址:https://www.cnblogs.com/Yangrui-Blog/p/9383812.html
Copyright © 2011-2022 走看看