hdu1850(nim博弈)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1850

题意:中文题诶~

思路:nim博弈

可以将本题抽象成一般nim博弈,那么有:

1. 对于所有元素异或值为0的情况为P局面

2. 若a1^a2...^ai...^an=m!=0,那么一定存在一个ai'使得a1^a2...^ai'...^an=0;不难算出ai'=num^ai;

即只要我们能将ai变成num^ai,那么对手将面对P局面;又从游戏规则可知ai'<ai(要从ai中拿掉一定数目的牌变成ai');

所以我们需要做的就是统计num^ai<ai的数目啦;

代码:

 1 #include <iostream>
 2 #define MAXN 1010
 3 using namespace std;
 4 
 5 int a[MAXN];
 6 
 7 int main(void){
 8     int n;
 9     while(cin >> n&&n){
10         int ans=0;
11         for(int i=0; i<n; i++){
12             cin >> a[i];
13             ans^=a[i];
14         }
15         if(!ans){
16             cout << 0 << endl;
17         }else{
18             int num=0;
19             for(int i=0; i<n; i++){
20                 if((ans^a[i])<a[i]){
21                     num++;
22                 }
23             }
24             cout << num << endl;
25         }
26     }
27     return 0;
28 }
View Code
原文地址:https://www.cnblogs.com/geloutingyu/p/6653079.html