• 一本通1667巧克力棒


    1667:巧克力棒

    时间限制: 1000 ms         内存限制: 524288 KB

    【题目描述】

    原题来自:BZOJ 1299

    TBL 和 X 用巧克力棒玩游戏。每次一人可以从盒子里取出若干条巧克力棒,或是将一根取出的巧克力棒吃掉正整数长度。TBL 先手两人轮流,无法操作的人输。他们以最佳策略一共进行了 10 轮(每次一盒)。你能预测胜负吗?

    【输入】

    输入数据共 20 行。第 2i−1 行一个正整数 Ni ,表示第 i 轮巧克力棒的数目。第 2i 行 Ni 个正整数 Li,j,表示第 i 轮巧克力棒的长度。

    【输出】

    输出数据共 10 行。每行输出 YES 或 NO,表示 TBL 是否会赢。如果胜则输出 NO,否则输出 YES。

    【输入样例】

    3
    11 10 15 
    5
    13 6 7 15 3 
    2
    15 12 
    3
    9 7 4 
    2
    15 12 
    4
    15 12 11 15 
    3
    2 14 15 
    3
    3 16 6 
    4
    1 4 10 3 
    5
    8 7 7 5 12

    【输出样例】

    NO
    YES
    YES
    YES
    NO
    YES
    YES
    YES
    NO

    【提示】

    数据范围与提示:

    对于 20% 的数据,N5,L100

    对于 40% 的数据,N≤7;

    对于 50% 的数据,L5000

    对于全部数据,N14,L109 。

    sol:先手要胜的话,取m根棒,使得这些棒异或和为0,且剩余的不可能取出异或和为0的情况,(实际上m就是巧克力棒的xor和为0的最长子序列)。


    %%%hzwer的题解

    题解

    先从n根巧克力棒中取出m(m>0)根,使得这m根巧克力棒的xor和为0(也就是把nim游戏的必败状态留给对方),同时使得剩下的n-m根巧克力棒无论怎么取,xor和都不为0。(实际上m就是巧克力棒的xor和为0的最长子序列)。

    这么一来,对手就面临一个必败状态的nim游戏。如果他从n-m根中取新的巧克力棒,实际上就是新建一个xor和不为0的nim游戏,这时轮到己方操作只要将这个新的nim游戏取到xor和为0即可。(也就是让对方再次面临所有nim游戏均为必败状态的局面)。

     

    寻找是否有Xor和=0的巧克力棒子序列,直接DFS无压力。


    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

    以上是对大佬的膜拜

    #include <bits/stdc++.h>
    using namespace std;
    typedef int ll;
    inline ll read()
    {
        ll s=0;
        bool f=0;
        char ch=' ';
        while(!isdigit(ch))
        {
            f|=(ch=='-'); ch=getchar();
        }
        while(isdigit(ch))
        {
            s=(s<<3)+(s<<1)+(ch^48); ch=getchar();
        }
        return (f)?(-s):(s);
    }
    #define R(x) x=read()
    inline void write(ll x)
    {
        if(x<0)
        {
            putchar('-'); x=-x;
        }
        if(x<10)
        {
            putchar(x+'0'); return;
        }
        write(x/10);
        putchar((x%10)+'0');
        return;
    }
    #define W(x) write(x),putchar(' ')
    #define Wl(x) write(x),putchar('
    ')
    const int N=20;
    int n,L[N];
    bool ans;
    inline void dfs(int Pos,int Xor,bool Flag)
    {
        if(Pos==n+1)
        {
            if((Xor==0)&&Flag) ans=1;
            return;
        }
        dfs(Pos+1,Xor,Flag);
        dfs(Pos+1,(Xor^L[Pos]),(Flag|1));
    }
    int main()
    {
        int i,T=10;
        while(T--)
        {
            ans=0;
            R(n);
            for(i=1;i<=n;i++) R(L[i]);
            dfs(1,0,0);
            if(ans) puts("NO");
            else puts("YES");
        }
        return 0;
    }
    View Code
  • 相关阅读:
    mysql 开启sql执行日志
    opcache.revalidate_freq 修改无效
    centos7 maven3.6.3安装
    CentOS7.5下基于FTP服务的局域网yum源搭建
    Centos7——防火墙(Firewall)开启常见端口命令
    Linux系统通过firewall限制或开放IP及端口
    CentOS7 FTP安装与配置
    centos7 搭建个人-企业私有云盘-seafile
    Centos6-7下杀毒软件clamav的安装和使用 (已成功测试)-----转发
    tomcat 安全规范(tomcat安全加固和规范1)--转发
  • 原文地址:https://www.cnblogs.com/gaojunonly1/p/10554764.html
Copyright © 2020-2023  润新知