HDU1850 Being a Good Boy in Spring Festival(博弈)
2016-06-28 18:18
381 查看
Being a Good Boy in Spring Festival
Submit Status
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
题意如题。
题解:考察的是对尼姆博弈本质的理解。如果先手能赢则异或值不为0,先手的第一步肯定是通过
修改一个数的值把这些数的异或值变为0。假设有n个数,设其中一个数为a是要减少的数,
那么a的值必须大于除了a以外的n-1个数的异或值才可以,只有大于才能通过a的减少使得
所有数的异或值为0,如果等于那说明所有数的异或值为0,先手必败。如果小于那么无论怎么
减少a都无法使得总异或值为0,二进制的表示中一定会有至少一个1存在着。
所以遍历每个数,看哪些数是刚才所述的符合条件的a,统计这样的数有多少个即为最终结果。
Time Limit: 1000MS | Memory Limit: 32768KB | 64bit IO Format: %I64d & %I64u |
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
题意如题。
题解:考察的是对尼姆博弈本质的理解。如果先手能赢则异或值不为0,先手的第一步肯定是通过
修改一个数的值把这些数的异或值变为0。假设有n个数,设其中一个数为a是要减少的数,
那么a的值必须大于除了a以外的n-1个数的异或值才可以,只有大于才能通过a的减少使得
所有数的异或值为0,如果等于那说明所有数的异或值为0,先手必败。如果小于那么无论怎么
减少a都无法使得总异或值为0,二进制的表示中一定会有至少一个1存在着。
所以遍历每个数,看哪些数是刚才所述的符合条件的a,统计这样的数有多少个即为最终结果。
#include <iostream> using namespace std; int main() { int n; while(cin>>n&&n) { int a[105],ans=0,cnt=0; for(int i=0;i<n;i++) { cin>>a[i]; ans^=a[i]; } for(int i=0;i<n;i++) { if(a[i]>(ans^a[i]))//注意加括号 cnt++; } //以下这段话看不懂也没关系。 在本代码中 1.可以将cout 0那句去掉 2.可以在大于判断的时候加上等号 //但是两者不能同时用 因为有一个数的等于成立那么所有的数的等于都成立 即cnt=n 也就是异或为0先手必败的情况 //如果两者同时用会把先手必败的输出0的情况变为输出n 这样是错误的 但是单独用没问题 if(ans) cout<<cnt<<endl; else cout<<0<<endl; } return 0; }
相关文章推荐
- java基础学习总结——super关键字
- java不定长参数方法
- 2016.6.28笔记(3)-Struts2
- java中拦截器与过滤器的区别分析
- Struts2 拦截器(Interceptor )原理和配置
- 项目中应用spring-beans源码剖析
- 解决Struts2 使用Common-FileUpload List<FileItem>为空的问题
- Eclipse各版本代号一览表
- spark出现GC overhead limit exceeded和java heap space
- Java虚拟机工作原理详解
- Java基础_Thread(一)
- 在Struts2中实现Web系统的初始化工作
- Java三大特性之---封装
- Java开源规则引擎-Drools
- Spring Boot中使用JavaMailSender发送邮件
- java.lang.OutOfMemoryError:GC overhead limit exceeded
- 玩转Eclipse开发工具(六)
- JAVA中null,"",equals,==相互之间使用详解
- Java动态代理
- 搭建rtmp直播流服务之2:使用java实现ffmpeg命令接口化调用(用java执行ffmpeg命令)