栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

5892. 石子游戏 IX (博弈)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

5892. 石子游戏 IX (博弈)

5892. 石子游戏 IX (博弈)

因为胜负只与 3 3 3的倍数有关。

将所有石子 ( m o d 3 ) pmod 3 (mod3)。

先手只能选1或2石子。

分别考虑选1 或者选2是否能赢。

因为具有对称性,不妨考虑选1.

因为0对于和无影响。

所以我们在1,2之间考虑。

显然1之后只能跟1

1-1

两个1之后只能跟2

1-1-2

该2后面只能跟1

1-1-2-1

依次类推:1-1-2-1-2-1-2…

即:1 (12)^t

考虑进行最大的回合数: l e n = m i n ( c 1 , c 2 ) × 2 + c 0 + 1 len=min(c_1,c_2)times 2+c_0+1 len=min(c1​,c2​)×2+c0​+1

此时:先手要赢,显然 l e n len len要为奇数,还有石子可以选。

即: l e n < n len

然后情况2同理。

class Solution {
public:
    bool f1(int c[3],int n){
        if(!c[1]) return false;
        c[1]--;
        int x=min(c[1],c[2])*2+c[0]+1;
        if(c[1]>c[2]) x++;
        c[1]++;//这里要加回去,因为是传的引用,后面f2还要用c数组.
        return (x&1)&&(x& a) {
        int n=a.size();
        int c[3]={};
        for(int x:a) c[x%3]++;
        return f1(c,n)||f2(c,n);
    }
};
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/289661.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号