[博弈] A Multiplication Game

题意&分析:
Stan和Ollie玩乘法游戏,从p=1开始,两人均可以将当前p乘上一个数k(2 <= k <= 9),谁先使p大于等于目标数n,那么获胜。stan是先手,两人都按照最佳策略走。

博弈问题,想了很久,不妨从目标数逆推回去,举个例子,n=162,那么使得自己的p处在 [18,161],是绝对会输的,,而区间 [9,17]就是安全的区间,你的对手会跑到前面那个必定输的区间,再向前,就是p=1了,通过逆推哦嘛=我们得到三个区间(最后p=1姑且算一个)。所以区间数是奇数是,先手的Stan获胜,偶数是Ollie获胜。

代码如下:

#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
#define TEST cout<<"stop here"<<endl
using namespace std;
typedef long long ll;
const ll mod = 1e9 + 7;

int main(){
    std::ios::sync_with_stdio(false);
    std::cin.tie(0);

    ll n;
    while(cin>>n){
        ll step = 0;
        while(n>1){
            if(++step%2)
                n = (n-1)/9 + 1;
            else 
                n = (n+1)/2;  
        }
        if(step%2)
            cout<< "Stan wins." <<endl;
        else
            cout<< "Ollie wins." <<endl;
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值