msc和mas----博弈模擬

 

鏈接:https://ac.nowcoder.com/acm/contest/217/A
來源:牛客網
題目描述:
msc有一天遇見了mas,於是他們開始玩遊戲。
msc和mas初始各有一個正整數A和B,並且他們共同設置了一個閾值L。
然後遊戲就開始了,對於每一局操作的人,假設他手上拿着的是數字x,對手手上拿着的是數字y(記這一局開始時y的數值爲y0),那麼:
1、如果x>L,那麼他就勝利了,否則進入步驟2
2、他會給對手的數值加上x(即),如果此時對手手上的數值y大於等於2y0,那麼這一輪結束輪到對手操作,否則繼續執行步驟2
由於mas愛慕着msc,所以mas想知道當msc先手或後手時能否勝利。

 

題意:判斷msc先手後手時候 其手中的值是否大於閾值,滿足則贏,不滿足則給對方累加自己的值 直到對手手上的數值y大於等於2y0。

解決思路:

這是一道模擬博弈題,通過模擬遊戲進程來獲取答案。

代碼:

#include <iostream>
#include <cstdio>
using namespace std;

bool isWin(int a,int b,int l)
{
    int sum_a,sum_b;
    sum_a=a;
    sum_b=b;
   while(1)
   {
       if(a>l)		//判斷先手的是否大於閾值
       {
           return true;	//大於閾值則返回true
       }

       while(sum_b<2*b)	//如果不大於 則執行步驟二  
       {
          sum_b+=a;	
	  //把對手的值用自己的值加到大於等於他初始值的二倍
	  //把該值賦給對手
       }
        b=sum_b;

       if(b>l)//判斷對手是否超過閾值
       {
            return false;//大於閾值則返回false
       }
       while(sum_a<2*a)//如果不大於 則執行步驟二  
       {
           sum_a+=b;
	//把對手的值用自己的值加到大於等於他初始值的二倍
	  //把該值賦給對手
       }
       a=sum_a;
   }
}
int main()
{
   long long a,b,l;
   long long sum_a,sum_b;

    while(cin>>a>>b>>l)
    {
	//msc爲先手
       if(isWin(a,b,l))
       {
           printf("Yes ");
       }
       else
       {
            printf("No ");
       }
	//msc爲後手
       if(isWin(b,a,l))
       {
            printf("No\n");
       }
       else
       {
           printf("Yes\n");
       }
    }
return  0;
}

示例:

輸入

232 42 9483

輸出

No No

運行結果:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章