Problem H. Game with the Stones 博弈论




题意:

之前理解错了题意了,没有看清楚

每一次都是将所有的石子都分一遍(这样的话就只用考虑最大堆即可)

两个人轮流分石子,Constantine这个人先手

每次将每一堆石子分为两堆,如果这一堆只有一个石子就不用分了

最后一个人没有办法再分堆的时候就输了

题解:

草稿纸上递推模拟:

1      败

2      胜(因为2分解得到1+1导致另外一个人败)

3      败(因为3分解得到2+1导致另外一个人胜)

4      胜(因为4分解得到2+2导致另外一个人败)

5      胜(因为5分解得到3+2导致另外一个人败)

6      胜(因为6分解得到3+3导致另外一个人败)

7      败(因为7任意一种分解后无法使另外一个人败)

..........

..........

最后我们可以发现

1   3   7  15   31  ..........

这些数字是一定失败的

故有了下面的代码



#include<stdio.h>

int main()
{
    int n;
    //freopen("in.txt","r",stdin);
    while(scanf("%d",&n)!=EOF)
    {
        int t=0,temp;
        while(n--)
        {
            scanf("%d",&temp);
            t=t>temp?t:temp;
        }

        long long cnt=1;
        while(cnt<t)
            cnt=cnt*2+1;

        puts(cnt!=t?"Constantine":"Mike");
    }
    return 0;
}


评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值