POJ1740 A New Stone Game
本题是博弈论的基础题。
对于这种题目,我们一般先手玩一波。
手玩发现:同时先手当且仅当石子有偶数堆并且对称时必败(这一个结论看似简单,实际要想到可能会话几十分钟),因为后手只要照着先手操作,先手必败(至于唯一性只能靠感悟了)
于是题目就转化成判断是否是对称的
做此类博弈类手玩题的技巧:
- 一定要自己多手玩,几十次也不为过。要各种极端情况全部考虑
- 对于一种看似正确的算法,一定要尽量给出证明,实在不行也要多举例子直到实在举不出反例为止
代码:
#include <iostream>
#include <string>
#include <algorithm>
#include <cmath>
#include <queue>
using namespace std;
int main(){
int n,x;
while (scanf("%d", &n) != EOF && n){
int flag=1;
priority_queue <int> q;
for (int i=1;i<=n;i++){
scanf("%d",&x);
q.push(x);
}
if (n%2==1){
cout<<"1"<<endl;
continue;
}
if (n%2==0){
while (q.size()>=2){
int m=q.top();
q.pop();
int n=q.top();
q.pop();
if (m!=n){
cout<<"1"<<endl;
flag=0;
break;
}
}
}
if (flag) cout<<"0"<<endl;
}
}