5892. 石子游戏 IX (博弈)

Posted Harris-H

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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<n len<n

然后情况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<n);
    }
    bool f2(int c[3],int n){
        if(!c[2]) return false;
        c[2]--;
         int x=min(c[1],c[2])*2+c[0]+1;
        if(c[1]<c[2]) x++;
        return (x&1)&&(x<n);       
    }
    bool stoneGameIX(vector<int>& a) {
        int n=a.size();
        int c[3]={};
        for(int x:a) c[x%3]++;
        return f1(c,n)||f2(c,n);
    }
};

以上是关于5892. 石子游戏 IX (博弈)的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 2029 石子游戏IX[博弈论 模拟] HERODING的LeetCode之路

LeetCode 2029. 石子游戏 IX

(HDU - 1527)取石子游戏(斐波那契博弈)

POJ1067 取石子游戏 威佐夫博弈 博弈论

USTC 1213取石子游戏(尼姆博弈)

HDU 2516 取石子游戏 斐波纳契博弈