BZOJ 1982 Moving Pebbles

首先我们假设只有两堆,

容易发现当且仅当两堆相等时,先手必败

否则先手必胜

然后我们猜测一下原因:

->当两堆相等时,无论先手怎么做,后手总能使两堆相等,且必败态为0,0

推广一下:

当所有的石子堆可以两两配对且配对的两两相等时,先手必败

否则先手必胜

证明一下:

1、当出现两两可以配对且相等的情况时,由两堆相等的情况可以推论,无论先手怎么做,后手总能使局面回到两两配对且相等的情况

2、如果不是两两可以配对且相等的情况时,先手总能使局面变成两两配对且相等

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
using namespace std;

const int maxn=100010;
int n;
int a[maxn];

int main(){
    while(scanf("%d",&n)==1){
        for(int i=1;i<=n;++i)scanf("%d",&a[i]);
        if(n&1){printf("first player\n");continue;}
        sort(a+1,a+n+1);
        bool f=false;
        for(int i=2;i<=n;i+=2){
            if(a[i]!=a[i-1]){f=true;break;}
        }
        if(f)printf("first player\n");
        else printf("second player\n");
    }return 0;
}

  

posted @ 2016-03-29 21:46  _Vertical  阅读(206)  评论(0编辑  收藏  举报