分贝壳游戏

30分解法

在p=q的情况下,是很著名的博弈——巴什博弈。每个k*(p+1)是必胜点,只要先手能取到k*(p+1)的点则先手必胜,取不到则后手必胜。能取到的唯一条件是

100分解法

看起来是个比较复杂的博弈,其实只是巴什博弈的扩展,只需要按照相同思想分类讨论考虑即可。代码很短但是其实需要思考的地方还是比较多的,下面给出思考过程:(p=q已经分析过了,下面是对时的分析)

p>q时

1.n<=p

牛牛一步取完了,牛牛必胜

2.n=p+1

牛牛先手取一个,还剩下p个贝壳,牛妹一次最多取q个贝壳,q<p,所以牛妹一次取不完,然后不管牛妹取多少贝壳牛牛下一次都能取完,所以牛牛必胜

3.n>p+1

3.1牛牛抢到了剩p+1个贝壳的情况

这时不管牛妹取几个贝壳,牛牛都能下次取完,牛牛必胜

3.2 牛妹为了不让牛牛抢到剩p+1个贝壳的情况,形成了场上剩余贝壳<=p+1的情况

3.2.1 剩余贝壳<=p 牛牛一次取完了,牛牛必胜

3.2.2 剩余贝壳=p+1同情况2,牛牛必胜

p<q时

其实逻辑是跟上面一样的,但是多了一种情况,就是p>=n时,因为p先手,所以这种情况下是先手赢,p<n时的分析和上面一样就不在赘述了,因为后手能控制必胜点所以后手必胜

综上所述 p>q时,牛牛必胜。p<q时,p>=n牛牛必胜,否则牛妹必胜。

代码如下:

class Solution {
public:
    /**
     *
     * @param n int整型
     * @param p int整型
     * @param q int整型
     * @return int整型
     */
    int Gameresults(int n, int p, int q) {
        // write code here
        int ans;
        if(p>q)ans=1;
        else if(q>p)
        {
            if(p>=n)ans=1;
            else ans=-1;
        }
        else
        {
            if(n%(p+1))ans=1;
            else ans=-1;
        }
        return ans;
    }
};
全部评论

相关推荐

不愿透露姓名的神秘牛友
06-20 14:55
点赞 评论 收藏
分享
秋盈丶:后续:我在宿舍群里和大学同学分享了这事儿,我好兄弟气不过把他挂到某脉上了,10w+阅读量几百条评论,直接干成精品贴子,爽
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务