zoukankan      html  css  js  c++  java
  • 40086311Nim

    试题描述
    有n堆石子,每堆各有ai颗石子。Alice和Bob轮流从非空的石子堆中取走至少一颗石子。Alice先取,取光所有石子的一方获胜。S双方都采取最优策略时,谁会获胜?
    输入
    一行,共n+1个数,第一个数为n,接下来共有n个数,两两之间用一个空格隔开。
    输出
    输出获胜一方的名字。
    输入示例
    3 1 2 4
    输出示例
    Alice
    其他说明
    1≤n≤ 1000000,1≤ai≤ 109
     
     1 #include <iostream>
     2 
     3 using namespace std;
     4 int p[105];
     5 int main()
     6 {
     7     int n,i,sum=0,cnt=0;
     8     scanf("%d",&n);
     9     for(i=1;i<=n;i++)
    10     {
    11         scanf("%d",&p[i]);
    12         sum=p[i]^sum;   //求p[i]和sum的异或值 
    13     }
    14     for(i=1;i<=n;i++)
    15         if(p[i]>(sum^p[i])) {cnt++;break;}    //注意'^'的优先级小于'>',所以要加括号 
    16     if(cnt>0) printf("Alice");
    17     else printf("Bob");
    18     //system("pause");
    19     return 0;
    20 }
    21 //^的意思不是乘方而是"异或"。
    22 //异或:二进制中,00或11都是0,10或01都是1。可以理解为不考虑进位的二进制加法。(1+1=0进位是1,舍去后当前位是0) 
    23 //本题规律:算每堆数量的异或,如果为0,则先手败,反之先手胜。 
    40086311Nim

     具体分析见相册。

  • 相关阅读:
    Java-数组
    排序-冒泡排序
    排序-选择排序
    Java-基础
    Java-Html-session
    Java-API
    Tomcat-常用设置
    Tomcat目录结构
    TOMCAT-安装配置
    Java-public
  • 原文地址:https://www.cnblogs.com/YXY-1211/p/5266510.html
Copyright © 2011-2022 走看看