题意:有n堆火柴,每人每次可以从一堆中拿走任意多个,两人轮流操作,谁无子可取谁输。输入n堆火柴各自的数量,输出先手是否能赢。
分析:NP问题,必胜态N(next player wins),必败态P(previous player wins)
分析:NP问题,必胜态N(next player wins),必败态P(previous player wins)
它是一个尼姆博奕的扩展(好像是,有待确认,但很类似,大家可以去看看这个算法)————按位异或
代码:
#include <iostream>
#include <stdio.h>
using namespace std;
int main()
{
long long n,a[25],i;
while(scanf("%lld",&n)!=EOF)
{
for(i=0;i<n;i++)
scanf("%lld",&a[i]);
int s=a[0];
for(i=1;i<n;i++)
s^=a[i];
if(s!=0)
printf("Yes\n");
else
printf("No\n");
}
return 0;
}