一个蒟蒻的肺腑之言:感觉博弈论的黄题比平衡树的紫题还要难呢呜呜呜(还不是因为太蒟)
0.题意
现在有两个数,两个人轮流玩游戏,每次从较大数中取出若干较小数的倍数,取到0者获胜。
给出两个数,问在两人都采用最优策略的情况下谁能赢。
1.思路
博弈论自然要考虑必胜态和必败态。(以下抄一段我题解时的稿)
设当前状态为\([a,b]\),其中\(a\leq b\)。
分三种情况:
1.\(a=b\)显然直接赢了
2.设\(b=qa+r\),若\(b\geq 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;
}
(话说博弈论的代码总是出奇的短呢)