zoukankan      html  css  js  c++  java
  • HDU3032 nim博弈

    题目大意:

    可以从某一堆中取任意个数,也可把一堆分成两个不为0的堆,直到某一方无法操作为输

    因为是nim博弈,所以只要考虑一堆时候的sg值,把所有堆的sg值异或即可

    很显然这里 0 是一个终止态 sg[0]=0;

    sg[1]=1 ;

    2 的时候可分为 0 , 1 , (1,1) 3种情况,sg值分别为 0,1,0,所以sg[2]=2

    3的时候可分为0,1,2,(1,2),sg值分别为0,1,2,3,所以sg[3]=4

    而4的时候sg[4]=3

    多试验可得sg(4k)=4k-1;sg(4k+1)=4k+1;sg(4k+2)=4k+2;sg(4k+3)=4k+4;

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <iostream>
     4 using namespace std;
     5 
     6 int main()
     7 {
     8   //  freopen("a.in" , "r" , stdin);
     9     int T;
    10     scanf("%d" , &T);
    11     while(T--)
    12     {
    13         int n,a;
    14         int ans=0;
    15         scanf("%d" , &n);
    16         for(int i=0 ; i<n ; i++){
    17             scanf("%d",&a);
    18             if(a%4==0) ans^=(a-1);
    19             else if(a%4==3) ans^=(a+1);
    20             else ans^=a;
    21         }
    22         if(ans) printf("Alice
    ");
    23         else printf("Bob
    ");
    24     }
    25     return 0;
    26 }
  • 相关阅读:
    Problem B. Harvest of Apples
    字典树的学习
    PACM Team
    2038: [2009国家集训队]小Z的袜子(hose)
    Naive Operations
    C程序设计语言练习 第三章
    数据结构C++实现-第一章 绪论
    排序
    操作系统设计与实现-第一章:序言
    进制转换
  • 原文地址:https://www.cnblogs.com/CSU3901130321/p/4256276.html
Copyright © 2011-2022 走看看