zoukankan      html  css  js  c++  java
  • [bzoj1299]巧克力棒

    为了方便考虑,不妨规定只有当当前的巧克力棒都取完了,才能拿新的巧克力棒
    然后令先手第一个拿的集合为S,根据nim游戏,当S的xor不为0时先手(即原来的后手)必胜,又轮到先手拿集合,那么只要一直不存在xor为0的集合,先手最终就必败
    然后当存在xor为0的集合,那么先手必然可以做到取一个最大xor子集,那么剩下的集合中一定不存在xor为0的子集(否则就可以更大),然后就变成了先手必胜
    判断是否存在xor为0的子集可以用线性基来判定(当然这个n太小暴力也行)

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 int n,x,s,a[105];
     4 void add(int x){
     5     for(int i=30;i>=0;i--)
     6         if (x&(1<<i))
     7             if (a[i])x^=a[i];
     8             else{
     9                 s++;
    10                 a[i]=x;
    11                 break;
    12             }
    13         
    14 }
    15 int main(){
    16     for(int ii=1;ii<=10;ii++){
    17         scanf("%d",&n);
    18         s=0;
    19         memset(a,0,sizeof(a));
    20         for(int i=1;i<=n;i++){
    21             scanf("%d",&x);
    22             add(x);
    23         }
    24         if (s<n)printf("NO
    ");
    25         else printf("YES
    ");
    26     }
    27 }
    View Code
  • 相关阅读:
    Trap 冷启动与热启动告警
    SNMP支持IPv6
    跨函数使用内存
    动态内存分配
    结构体
    指针和数组
    组合模式
    类方法实用点语法调用
    数据结构与算法定义
    RAC初步使用
  • 原文地址:https://www.cnblogs.com/PYWBKTDA/p/11832844.html
Copyright © 2011-2022 走看看