一个蒟蒻的肺腑之言:感觉博弈论的黄题比平衡树的紫题还要难呢呜呜呜(还不是因为太蒟)
0.题意
现在有两个数,两个人轮流玩游戏,每次从较大数中取出若干较小数的倍数,取到0者获胜。
给出两个数,问在两人都采用最优策略的情况下谁能赢。
1.思路
博弈论自然要考虑必胜态和必败态。(以下抄一段我题解时的稿)
设当前状态为([a,b]),其中(aleq b)。
分三种情况:
1.(a=b)显然直接赢了
2.设(b=qa+r),若(bgeq 2a),则可以转到([a,r+a]or[r,a])。
若([r,a])必胜,直接转;
若([r,a])必败,则先转到([a,r+a]),将必败态扔给对手。
所以必胜。
3.(b<2a),此时只能暴力模拟了,(go to 2)。
2.代码
我采用了递归模拟,上面说到的细节都在代码里体现了。
函数参数的命名有点诡异,winner是当前操作,人名是两个数字。——特此注。
int C,n,m;
bool Play(int stan,int ollie,bool winner){
if(stan==ollie||ollie/stan>=2)return winner;
else return Play(ollie-stan,stan,!winner);
}
int main(){
Read(C);
while(C--){
Read(m),Read(n);
if(m>n)swap(m,n);
cout<<(Play(m,n,0)?"Ollie wins":"Stan wins")<<endl;
}
return 0;
}
(话说博弈论的代码总是出奇的短呢)