poj2505(典型博弈)

本文探讨了一个涉及数论与博弈论的数学问题:给定一个正整数k,玩家通过乘以2到9之间的任意整数来操作变量n,目标是第一个使n大于等于k的玩家获胜。文章详细介绍了解题思路,通过分析必胜态与必败态的交替规律,最终确定初始状态下的胜负归属。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:n = 1,输入一个k,每一次n可以乘以[2,9]中的任何一个数字,两个玩家轮流操作,谁先使得n >= k就胜出
这道题目感觉还不错,自己做了好久都没做出来,然后看了解题才理解的。
解题思路:能进入必败态的状态时必胜态,只能到达胜态的状态为必败态,当n >= K是必败态,[ceil(k/9.0),k-1]是必胜态,
[ceil(ceil(k/9.0)/2.0),ceil(k/9.0)-1]是必败态,这样必胜态和必败态交替,最后就能得到1是在必败还是必胜

其中ceil()是向上取整函数


#include<iostream>
#include<algorithm>
#include<cstring>
#include<stack>
#include<queue>
#include<set>
#include<map>
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#include<time.h>
#include<math.h>

#define inf 0x7ffffff
#define eps 1e-9
#define pi acos(-1.0)
#define P system("pause")
using namespace std;

int main()
{
//freopen("input.txt","r",stdin);
//freopen("output.txt","w",stdout);
    long long k;
    while(scanf("%lld",&k) != EOF)
    {
        long long a,b,flag;
        a = ceil(k/9.0);
        b = k-1;
        flag = 1;
        while(1)
        {
           // cout<<a<<" "<<b<<endl;
            if(1 >= a && 1 <= b)
            {
                if(flag) printf("Stan wins.\n");
                else printf("Ollie wins.\n");
                break;
            }
            if(flag)
            {
                b = a-1;  a = ceil(a/2.0);
                flag = 0;
            }
            else {
                int t = b;
                b = a - 1;  a = ceil(a/9.0);
                flag = 1;
            }
        }


    }


    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值