POJ 1740 A New Stone Game【博弈】

题意:

给定n堆石子,两个人,每个人至少从堆中拿出一个石子,然后可以随意的从这堆石子中拿出一部分给其他堆。问最后谁赢?

分析:

  1. n = 1,先手必胜。
  2. n = 2,若两堆相等,则后手每次拿与先手相同数量,后手必胜。否则先手必胜。
  3. n = 3,从最大堆中拿出一部分填补剩下两堆,使数目相等,然后拿走最大堆剩下的部分。先手必胜。
  4. n >= 4
    • 奇数:从最大堆中拿出一部分,填补剩下的所有堆,使得两两相等。剩下的拿走。先手必胜。
    • 偶数:从最大堆中拿出一部分,使该堆剩下的和最小堆相等,填补剩下的所有堆,使得两两相等。先手必胜。

所以说~~先手输的情况就只是偶数堆,且不存在最小堆,即所有堆大小相等。

代码:

#include<iostream>
#include<algorithm>
using namespace std;
const int maxn = 15;
int a[maxn];
int main (void)
{
    int n;
    while(cin>>n && n){
        for(int i = 0; i < n; i++) cin>>a[i];
        sort(a, a + n);
        int res = 0;
        if(n & 1) cout<<1<<endl;
        else{
            for(int i = 0; i < n - 1; i+=2){
                if(a[i] != a[i + 1]){
                   res = 1;
                   break;
                }
            }
            cout<<res<<endl;
        }
    }
    return 0;
}

你可能感兴趣的:(POJ 1740 A New Stone Game【博弈】)