• [洛谷P1290][题解]欧几里德的游戏


    一个蒟蒻的肺腑之言:感觉博弈论的黄题比平衡树的紫题还要难呢呜呜呜(还不是因为太蒟)

    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;
    }
    

    (话说博弈论的代码总是出奇的短呢)

    3.完结撒花

  • 相关阅读:
    242. Valid Anagram
    [wikioi]关押罪犯
    [wikioi]数的划分
    [wikioi]能量项链
    [wikioi]线段覆盖 2
    [wikioi]乌龟棋
    POJ1011 Sticks
    *[leetcode]Word Break II
    [leetcode]Word Break
    《高性能网站建设指南》笔记
  • 原文地址:https://www.cnblogs.com/juruoajh/p/12906114.html
Copyright © 2020-2023  润新知