zoukankan      html  css  js  c++  java
  • [BZOJ1299]巧克力棒(博弈论,线性基)

    [BZOJ1299]巧克力棒

    Description

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

    Input

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

    Output

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

    Sample Input

    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

    Sample Output

    YES
    NO
    YES
    YES
    YES
    NO
    YES
    YES
    YES
    NO

    HINT

    20%的分数,N<=5,L<=100。

    40%的分数,N<=7。 50%的分数,L<=5,000。

    100%的分数,N<=14,L<=1,000,000,000。

    考虑我们要怎么赢,每次拿出火柴时让对手面对异或值为0的局面,并且让剩下的火柴中不存在异或值为0的局面,其实这就等价于火柴中存在异或值为0的集合。
    所以我们可以把每堆火柴丢到线性基里面,判断这个值能否被异或出来即可。

    #include<bits/stdc++.h>
    #define lll long long
    using namespace std;
    lll read(){
    	lll x=0,w=1;char ch=getchar();
    	while(ch>'9'||ch<'0'){if(ch=='-')w=-1;ch=getchar();}
    	while(ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
    	return x*w;
    }
    lll n,a[15],c[50],flag;
    void insert(lll v){
    	for(lll i=32;i>=0;i--){
    		if(!(v>>i))continue;
    		if(!c[i]){c[i]=v;break;}
    		v^=c[i];if(!v){flag=1;break;}
    	}
    }
    void work(){
    	flag=0;memset(c,0,sizeof(c));
    	n=read();for(lll i=1;i<=n;i++)a[i]=read(),insert(a[i]);
    	if(flag)printf("NO
    ");else printf("YES
    ");
    }
    int main(){
    	lll t=10;
    	while(t--)work();
    }
    
  • 相关阅读:
    Shell编程------函数应用
    Shell编程------循环语句
    Shell编程------判断语句
    Shell编程------变量、赋值和运算
    Action实现prepareable接口后定义前置方法
    动态代理模式
    hibernate持久化对象,
    view视图总结
    servlet和Struts2的线程安全性对比
    Action获取请求参数的3中方式
  • 原文地址:https://www.cnblogs.com/lsgjcya/p/9791992.html
Copyright © 2011-2022 走看看