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

     具体分析见相册。

  • 相关阅读:
    经典之计算机内存管理
    Git 远程仓库
    【玩转微信公众平台之十】 图文消息回复解说
    C++11中的继承构造函数
    树莓派使用无线网卡上网相关命令
    swift的UITableView的使用
    相似微信的ChattingUi
    HDOJ 5289 Assignment 单调队列
    poj1936
    samba 文件和目录权限控制
  • 原文地址:https://www.cnblogs.com/YXY-1211/p/5266510.html
Copyright © 2011-2022 走看看