您的位置:首页 > 编程语言 > Java开发

HDU 1850 Being a Good Boy in Spring Festival 在春节做乖孩子(Nim博弈,微变形)

2015-05-14 15:16 519 查看
题意:

思路:

  如果全部扑克牌数目异或的结果ans为0,则必输,输出0。否则,必须要给对方一个P状态,可以对所有扑克堆进行逐个排查,将ans^a[i]就可以得到除了a[i]之外其他扑克数的异或结果tmp,目的就是要使得tmp为0,那么肯定要从a[i]堆中拿走一些牌使得剩下的牌数异或tmp为0。可能出现的情况(1)tmp比a[i]还大,那么这不是正确的方案。(2)tmp=0,那么要将a[i]全部取走。(3)tmp<a[i],那么要取走a[i]-tmp张牌,留下tmp张,刚好异或结果为0。

#include <iostream>
#include <cstdio>
using namespace std;
int a[101];
int main()
{
//freopen("input.txt", "r", stdin);
int n;
while(cin>>n,n)
{
for(int i=0; i<n; i++)
scanf("%d",&a[i]);

int ans=a[0], cnt=0;
for(int i=1; i<n; i++)
ans^=a[i];

if(!ans)    cout<<"0"<<endl;    //必输
else
{
for(int i=0; i<n; i++)
{
int tmp=ans^a[i];
if(a[i]-tmp>=0)
cnt++;
}
cout<<cnt<<endl;
}
}
return 0;
}


AC代码
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: