zoukankan      html  css  js  c++  java
  • HDU

    先上题目:

    Being a Good Boy in Spring Festival

    Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 4557    Accepted Submission(s): 2713


    Problem Description
    一年在外 父母时刻牵挂
    春节回家 你能做几天好孩子吗
    寒假里尝试做做下面的事情吧

    陪妈妈逛一次菜场
    悄悄给爸爸买个小礼物
    主动地 强烈地 要求洗一次碗
    某一天早起 给爸妈用心地做回早餐

    如果愿意 你还可以和爸妈说
    咱们玩个小游戏吧 ACM课上学的呢~

    下面是一个二人小游戏:桌子上有M堆扑克牌;每堆牌的数量分别为Ni(i=1…M);两人轮流进行;每走一步可以任意选择一堆并取走其中的任意张牌;桌子上的扑克全部取光,则游戏结束;最后一次取牌的人为胜者。
    现在我们不想研究到底先手为胜还是为负,我只想问大家:
    ——“先手的人如果想赢,第一步有几种选择呢?”
     
    Input
    输入数据包含多个测试用例,每个测试用例占2行,首先一行包含一个整数M(1<M<=100),表示扑克牌的堆数,紧接着一行包含M个整数Ni(1<=Ni<=1000000,i=1…M),分别表示M堆扑克的数量。M为0则表示输入数据的结束。
     
    Output
    如果先手的人能赢,请输出他第一步可行的方案数,否则请输出0,每个实例的输出占一行。
     
    Sample Input
    3
    5 7 9
    0
     
    Sample Output
    1
     
    Author
    lcy
     
      Nim模型,先求出所有堆数的异或结果ans,然后将ans与每一堆的堆数异或,如果结果小于这一个堆的堆数,那么就有一种先行方案。为什么呢?
      假设我们有a1,a2,a3,a4,a5,``````,an这么多堆扑克牌,然后将求出异或结果x,则x=a1^a2^a3``````^an。现在我们考虑先手怎样才能赢,因为先手赢的条件是x不等于0,对于某个ai^x的值:
      因为ai^x=ai^a1^a2^a3^``````ai^```an。
      那么右边等于除了ai以外的堆数的异或和,也就是说,我们需要从ai上面取剩ai^x个的话,那么我们就可以将必败态推给后手了。这里成立的条件当然是存在ai^x,因为ai的扑克牌一定需要减少的,所以取走了一部分扑克牌以后的值一定要小于ai,这样才能成立。
     
    上代码:
     
     1 #include <iostream>
     2 #include <cstring>
     3 #define MAX 100
     4 using namespace std;
     5 
     6 int s[MAX];
     7 
     8 int main()
     9 {
    10     int m,sum,ans;
    11     ios::sync_with_stdio(false);
    12     while(cin>>m,m){
    13         ans=0;
    14         for(int i=0;i<m;i++){
    15             cin>>s[i];
    16             ans^=s[i];
    17         }
    18         sum=0;
    19         for(int i=0;i<m;i++){
    20             if((ans^s[i])<s[i]) sum++;
    21         }
    22         cout<<sum<<endl;
    23     }
    24     return 0;
    25 }
    /*1850*/
     
  • 相关阅读:
    1026 Table Tennis (30)
    1029 Median
    1025 PAT Ranking (25)
    1017 Queueing at Bank (25)
    1014 Waiting in Line (30)
    1057 Stack (30)
    1010 Radix (25)
    1008 Elevator (20)
    字母大小写转换
    Nmap的基础知识
  • 原文地址:https://www.cnblogs.com/sineatos/p/3887570.html
Copyright © 2011-2022 走看看