鏈接: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
運行結果: