http://poj.org/problem?id=1740
这个博弈一眼看上去很厉害很高大上让人情不自禁觉得自己不会写,结果又是找规律……
博弈一般后手胜都比较麻烦,但是主要就是找和先手的对应关系,依然看了题解……
如果所有石头堆两两配对的话后手对先手的每一步都可以对应走一步,那么此时后手必胜。
如果不是两两配对,先手可以通过一次操作使石头堆两两配对,此时的两两配对局面面对的是后手,所以先手必胜。
不是两两配对时的操作:首先将所有非配对推按大小排序(只有一堆直接取没就可以了);
然后显然不配对的堆数为奇数时,最大堆能把前面的填成两两配对(剩下的扔了)。为偶数时,最大堆留下和最小堆一样多的,然后依然能把剩余的填成两两配对。
太鬼畜了orz
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<cmath> 5 #include<iostream> 6 #include<map> 7 using namespace std; 8 const int maxn=1010; 9 int n; 10 int a[maxn]={}; 11 int main(){ 12 while(~scanf("%d",&n)){ 13 if(!n)return 0; 14 for(int i=1;i<=n;i++){ 15 scanf("%d",&a[i]); 16 } 17 if(n&1)printf("1\n"); 18 else{ 19 sort(a+1,a+1+n); 20 int f=0; 21 for(int i=2;i<=n;i+=2){ 22 if(a[i]!=a[i-1]){ 23 f=1;break; 24 } 25 } 26 printf("%d\n",f); 27 } 28 } 29 return 0; 30 }