当前位置: 首页 > news >正文

HDU 1850 Being a Good Boy in Spring Festival (Nim博弈)

Being a Good Boy in Spring Festival

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


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
 

 

Source
ACM Short Term Exam_2007/12/13
 

 

Recommend
lcy
 

 

一.
      如果a1^a2^a3^...^an=0 ( 即 : nim-sum=0 ) , 说明先手没有必赢策略, 方法数肯定为 0;
二.

      假设先手的人有必赢策略。

            问题则转化为=>在任意一堆拿任意K张牌,并且剩下所有堆的nim-sum=0(P-position)的方案总数。

                     1. 现在我们先看一个例子(5,7,9),并假设从第一堆取任意K张牌。

                              排除第一堆牌的nim-sum为 7^9=14

                                            0111

                                          ^1001

                                          -------

                                            1110

                              如果要使所有堆的nim-sum=0成立,则第一堆取掉K张以后必定为1110,因为X^X=0。

                              所以要观察 5-k=14 k>0 成立,此例子(在第一堆取任意K张牌)明显的不成立。但并不代表在第二或第三堆取任意K张牌的解不成立。

                     2. 现在看第二个例子(15,7,9),并假设从第一堆取任意K张牌。

                              排队第一堆牌的nim-sum为7^9=14,和第一个例子相同,所以问题变为观察 15-k=14 k>0 是否成立。

                              当然这个例子是成立的。

三.
      总结得出:

            在任意一堆拿任意K张牌,并且所有堆的nim-sum=0 成立的条件为:排除取掉K张牌的那一堆的nim-sum必须少于该堆牌上的数量(例子二),否则不能在此堆上取任意K张牌使所有堆的nim-sum=0成立(例子一)。

            故总方案数为 ( 在任意一堆拿任意K张牌,并且所有堆的nim-sum=0 成立 ) 的总数。

 

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>

using namespace std;

int n,a[110];

int main(){

    //freopen("input.txt","r",stdin);

    while(~scanf("%d",&n) && n){
        int ans=0;
        for(int i=0;i<n;i++){
            scanf("%d",&a[i]);
            ans^=a[i];
        }
        if(ans==0){
            puts("0");
            continue;
        }
        int cnt=0;
        for(int i=0;i<n;i++)
            if((a[i]^ans)<=a[i])    //这样保证从该堆中能取到合法的数目(即不超过该堆扑克牌的总数)
                cnt++;
        printf("%d\n",cnt);
    }
    return 0;
}

 

相关文章:

  • 20非常有用的Java程序片段(6-10)
  • BizTalk RosettaNet解决方案之Loopback
  • YAFFS2文件系统分析(转)
  • 如何设置Linux操作系统shell命令的默认语言
  • 基于HTML5的燃气3D培训仿真系统
  • Android 解决ScrollView嵌入ListView | GridView | ScrollView显示问题
  • 万能写入sql语句,并且防注入
  • 进程通信
  • Delphi控制Excel
  • Tigase XMPP Server源码部署
  • 在iphone越狱机器中使用Hook
  • 报错:具有键...的ViewData项属于类型...,但它必须属于类型IEnumerableSelectListItem...
  • DELPHI7在WIN8和WIN10下安装和运行
  • mysql 如何选择随机行
  • 字符串通信协议解析函数
  • @angular/forms 源码解析之双向绑定
  • 3.7、@ResponseBody 和 @RestController
  • Android开发 - 掌握ConstraintLayout(四)创建基本约束
  • css系列之关于字体的事
  • JavaScript类型识别
  • jQuery(一)
  • Laravel深入学习6 - 应用体系结构:解耦事件处理器
  • overflow: hidden IE7无效
  • PAT A1120
  • rabbitmq延迟消息示例
  • Ruby 2.x 源代码分析:扩展 概述
  • SegmentFault 技术周刊 Vol.27 - Git 学习宝典:程序员走江湖必备
  • Twitter赢在开放,三年创造奇迹
  • windows下如何用phpstorm同步测试服务器
  • 从 Android Sample ApiDemos 中学习 android.animation API 的用法
  • 聚簇索引和非聚簇索引
  • 猫头鹰的深夜翻译:JDK9 NotNullOrElse方法
  • 目录与文件属性:编写ls
  • 让你的分享飞起来——极光推出社会化分享组件
  • 试着探索高并发下的系统架构面貌
  • 双管齐下,VMware的容器新战略
  • 写代码的正确姿势
  • 用 vue 组件自定义 v-model, 实现一个 Tab 组件。
  • 由插件封装引出的一丢丢思考
  • d²y/dx²; 偏导数问题 请问f1 f2是什么意思
  • Java数据解析之JSON
  • ​MySQL主从复制一致性检测
  • ​用户画像从0到100的构建思路
  • #常见电池型号介绍 常见电池尺寸是多少【详解】
  • (11)MATLAB PCA+SVM 人脸识别
  • (3)nginx 配置(nginx.conf)
  • (8)STL算法之替换
  • (C语言)逆序输出字符串
  • (Pytorch框架)神经网络输出维度调试,做出我们自己的网络来!!(详细教程~)
  • (安卓)跳转应用市场APP详情页的方式
  • (分布式缓存)Redis持久化
  • (附源码)springboot青少年公共卫生教育平台 毕业设计 643214
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (五)Python 垃圾回收机制
  • (转)ABI是什么