acm pku 2234 解题报告(取子问题)
来源:互联网 发布:一条sql删除 重复数据 编辑:程序博客网 时间:2024/06/05 15:13
题目是这样的,两个人玩一种取火柴的游戏,火柴有若干堆,某个人去取时,可以从某一堆中取若干
根,谁最后把所有的火柴取完谁就是胜者。接着给出几组数据,对于每一组数据,第一个数 n 为火柴的堆数,
接下来的 n 个数据为每一堆火柴的数量,如果最终第一个取火柴的人会获胜,则输出 Yes,否则输出 No。
这显然是一个取子问题,如果这两个人都知道取的策略,我们可以知道结改局在取之前就可以定下来。
如果这几堆火柴是非平衡的,那么第一个取的人可以取若干根火柴使它达到平衡,到最后这个人毕然会赢。反
之,如果火柴刚开始就是平衡的,那么第一个人一取就破坏了平衡,从而让另外一个人赢了。
怎样来判断这几堆火柴是否是平衡的呢,有人已经总结出来了,请看下面。
具体的操作我们可以用位运算来实现:
#include <iostream>
using namespace std;
int an[]={1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536,131072,262144,524288,1048576,2097152,4194304,8388608,16777216,33554432,67108864,134217728,268435456,536870912,1073741824};
int main()
{
int n;
while(cin>>n)
{
int str[30];
for(int k=0;k<n;++k)
cin>>str[k];
int i=0;
for(i=0;i<31;++i)
{
int sum = 0;
for(int j=0;j<n;++j)
{
int c = an[i]&str[j];
if(c != 0)
sum++;
}
//cout<<sum<<endl;
if(sum%2 !=0 )
{
cout<<"Yes"<<endl;
break;
}
}
if(i == 31)
cout<<"No"<<endl;
}
return 0;
}
根,谁最后把所有的火柴取完谁就是胜者。接着给出几组数据,对于每一组数据,第一个数 n 为火柴的堆数,
接下来的 n 个数据为每一堆火柴的数量,如果最终第一个取火柴的人会获胜,则输出 Yes,否则输出 No。
这显然是一个取子问题,如果这两个人都知道取的策略,我们可以知道结改局在取之前就可以定下来。
如果这几堆火柴是非平衡的,那么第一个取的人可以取若干根火柴使它达到平衡,到最后这个人毕然会赢。反
之,如果火柴刚开始就是平衡的,那么第一个人一取就破坏了平衡,从而让另外一个人赢了。
怎样来判断这几堆火柴是否是平衡的呢,有人已经总结出来了,请看下面。
现在考虑各大堆大小分别为N1,N2,……Nk的一般的Nim取子游戏。将每一个数Ni表示为其二进制数(数的位数相等,不等时在前面补0):
N1 = as…a
N2 = bs…b1b0
……
Nk = ms…m
如果每一种大小的子堆的个数都是偶数,我们就称Nim取子游戏是平衡的,而对应位相加是偶数的称为平衡位,否则称为非平衡位。因此,Nim取子游戏是平衡的,当且仅当:
as + bs + … + ms 是偶数
……
a1 + b1 + … + m1 是偶数
a0 + b0 + … + m0是偶数
具体的操作我们可以用位运算来实现:
#include <iostream>
using namespace std;
int an[]={1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536,131072,262144,524288,1048576,2097152,4194304,8388608,16777216,33554432,67108864,134217728,268435456,536870912,1073741824};
int main()
{
int n;
while(cin>>n)
{
int str[30];
for(int k=0;k<n;++k)
cin>>str[k];
int i=0;
for(i=0;i<31;++i)
{
int sum = 0;
for(int j=0;j<n;++j)
{
int c = an[i]&str[j];
if(c != 0)
sum++;
}
//cout<<sum<<endl;
if(sum%2 !=0 )
{
cout<<"Yes"<<endl;
break;
}
}
if(i == 31)
cout<<"No"<<endl;
}
return 0;
}
- acm pku 2234 解题报告(取子问题)
- acm pku 1321解题报告 棋盘问题
- ACM pku 1005 解题报告
- ACM pku 1004 解题报告
- pku acm 1450 解题报告
- pku acm 1005 解题报告
- acm pku 2418解题报告
- acm pku 1423解题报告
- acm pku 2479解题报告
- acm pku 1128解题报告
- ACM pku 1067 解题报告(威佐夫博奕(Wythoff Game))
- ACM pku 1658 解题报告(另一种输入输出方式)
- ACM pku 1003 解题报告(练习输入输出)
- ACM pku 1140 解题报告(Expanding Fractions )
- Pku acm 1316 Self Numbers 解题报告
- acm pku 1032 Parliament 解题报告
- 约瑟夫 (Joseph) -- ACM PKU 1012 解题报告
- Sum - ACM PKU 1844 解题报告
- 用ADO向excel批量导入数
- 多年开发Oracle,积累的Oracle基础函数库。(转载)
- 线性链表实现注意事项
- 新奇家居用品 The Wellness Skull 骷髅小床[多图]
- 什么是lib文件,lib和dll的关系如何
- acm pku 2234 解题报告(取子问题)
- ConcurrentHashMap原理分析
- 智能ABC你真的会用吗?[转]
- LAN网络故障时的简单排除方法
- ASP菜鸟程序员的城战国之路
- 使用PLSQL Developer时,“ORA-12154: TNS:无法解析指定的连接标识符”问题的解决方法
- C语言隐式类型转换规则
- 中秋到了,公司都发的什么
- Zend Studio无法启动的解决办法