leetcode 2029. 石子游戏 IX 中等

Alice 和 Bob 再次设计了一款新的石子游戏。现有一行 n 个石子,每个石子都有一个关联的数字表示它的价值。给你一个整数数组 stones ,其中 stones[i] 是第 i 个石子的价值。

Alice 和 Bob 轮流进行自己的回合,Alice 先手。每一回合,玩家需要从 stones 中移除任一石子。

  • 如果玩家移除石子后,导致 所有已移除石子 的价值 总和 可以被 3 整除,那么该玩家就 输掉游戏
  • 如果不满足上一条,且移除后没有任何剩余的石子,那么 Bob 将会直接获胜(即便是在 Alice 的回合)。

假设两位玩家均采用 最佳 决策。如果 Alice 获胜,返回 true ;如果 Bob 获胜,返回 false

示例 1:

复制代码
输入:stones = [2,1]
输出:true
解释:游戏进行如下:
- 回合 1:Alice 可以移除任意一个石子。
- 回合 2:Bob 移除剩下的石子。 
已移除的石子的值总和为 1 + 2 = 3 且可以被 3 整除。因此,Bob 输,Alice 获胜。

示例 2:

复制代码
输入:stones = [2]
输出:false
解释:Alice 会移除唯一一个石子,已移除石子的值总和为 2 。 
由于所有石子都已移除,且值总和无法被 3 整除,Bob 获胜。

示例 3:

复制代码
输入:stones = [5,1,2,4,3]
输出:false
解释:Bob 总会获胜。其中一种可能的游戏进行方式如下:
- 回合 1:Alice 可以移除值为 1 的第 2 个石子。已移除石子值总和为 1 。
- 回合 2:Bob 可以移除值为 3 的第 5 个石子。已移除石子值总和为 = 1 + 3 = 4 。
- 回合 3:Alices 可以移除值为 4 的第 4 个石子。已移除石子值总和为 = 1 + 3 + 4 = 8 。
- 回合 4:Bob 可以移除值为 2 的第 3 个石子。已移除石子值总和为 = 1 + 3 + 4 + 2 = 10.
- 回合 5:Alice 可以移除值为 5 的第 1 个石子。已移除石子值总和为 = 1 + 3 + 4 + 2 + 5 = 15.
Alice 输掉游戏,因为已移除石子值总和(15)可以被 3 整除,Bob 获胜。

提示:

  • 1 <= stones.length <= 10^5
  • 1 <= stones[i] <= 10^4

分析:先思考 stones 没有 0 的情况。

讨论 stones 中的 1 和 2 的个数:

  1. 如果只有 1。当 n≤2 时,可以移除所有石子,Bob 获胜。当 n≥3 时,第三回合 Alice 移除石子后,总和为 3,Alice 输。所以 Bob 必胜。
  2. 如果只有 2。当 n≤2 时,可以移除所有石子,Bob 获胜。当 n≥3 时,第三回合 Alice 移除石子后,总和为 6,Alice 输。所以 Bob 必胜。
  3. 如果 1 和 2 都有且 1 的个数更少(或者相等),那么 Alice 选择序列 1,1,2,1,2,1,2,...,由于 1 比 2 先消耗完,且在 Bob 的回合移除的都是 1,所以若干回合后 Bob 无法移除 1,只能移除 2,导致总和是 3 的倍数,输掉游戏。所以 Alice 必胜。
  4. 如果 1 和 2 都有且 2 的个数更少(或者相等),那么 Alice 选择序列 2,2,1,2,1,2,1,...,由于 2 比 1 先消耗完,且在 Bob 的回合移除的都是 2,所以若干回合后 Bob 无法移除 2,只能移除 1,导致总和是 3 的倍数,输掉游戏。所以 Alice 必胜。
  5. 即如果 stones 没有 0,那么当且仅当 stones 包含 1 和 2 的情况下 Alice 必胜。

然后讨论 stones 有 0 的情况。

  1. 如果 stones 只有 0,那么第一回合 Alice 移除石子后,总和是 3 的倍数,Alice 输。所以 Bob 必胜。
    1. 如果 stones 有偶数个 0。
    2. 对于前文 Alice 必胜的情况,如果某个回合 Bob 移除了 0,那么 Alice 就跟着移除 0,所以不影响必胜结论。
    3. 对于前文 Bob 必胜的情况,如果某个回合 Alice 移除了 0,那么 Bob 就跟着移除 0,所以不影响必胜结论。
  2. 如果 stones 有奇数个 0。
    1. 如果没有 2。
      1. 如果 1 的个数为 1 或者 2,那么可以移除所有石子,Bob 获胜。
      2. 如果至少有 3 个 1 且第二回合 Bob 移除 0,那么第三回合 Alice 移除 1。后续两人交替移除完所有 0,最后轮到 Bob 移除第三个 1,Bob 输。
      3. 如果至少有 3 个 1 且第二回合 Bob 移除 1,那么第三回合 Alice 移除 0。后续两人交替移除完所有 0,最后轮到 Bob 移除第三个 1,Bob 输。
    2. 如果没有 1,同上,结论类似。
    3. 如果 1 和 2 都有。设 cnt 1 和 cnt 2 分别为 1 和 2 的个数。
      1. 如果 Alice 仍然像前文那样操作,那么第二回合 Bob 移除 0,相当于交换了先后手,最后 Bob 必胜。
      2. 所以 Alice 必须反过来。如果 cnt <cnt 2 ,那么 Alice 选择序列 2,2,1,2,1,2,1,... 如果第二回合 Bob 移除 0,那么后续 Bob 的回合移除的都是 1,所以若干回合后 Bob 无法移除 1,只能移除 2,导致总和是 3 的倍数,输掉游戏。所以 Bob 肯定不能先移除 0,那么第三回合 Alice 移除 0,即两人的序列为 2,2,0,1,2,1,2,1,...,在 cnt 2 −cnt 1≥3 的情况下,最终 Bob 无法移除 1,只能移除 2,导致总和是 3 的倍数,输掉游戏,Alice 获胜。如果 1≤cnt 2 −cnt 1 ≤2,那么可以移除所有石子,Bob 获胜。
    4. 如果 cnt 1 >cnt 2,同上,结论类似。
    5. 如果 cnt 1 =cnt 2,无论序列是 2,2,0,1,2,1,2,1,... 还是 1,1,0,2,1,2,1,2,...,若干回合后 Alice 无法移除相应数字,导致总和是 3 的倍数,输掉游戏,Bob 获胜。
    6. 综上所述:如果 stones 有偶数个 0(包括 0 个 0),那么当且仅当 stones 包含 1 和 2 的情况下 Alice 必胜。如果 stones 有奇数个 0,那么当且仅当 ∣cnt 1 −cnt 2∣≥3 成立时 Alice 必胜。
cpp 复制代码
int min(int a,int b)
{
    return a>b?b:a;
}
int max(int a,int b)
{
    return a>b?a:b;
}
bool stoneGameIX(int* stones, int stonesSize) {
    int n=stonesSize,cnt[5]={0};
    for(int i=0;i<n;++i)
        cnt[stones[i]%3]++;
    if(!cnt[1])
    {
        if(cnt[2]<3||(cnt[2]>=3&&cnt[0]%2==0))return false;
    }
    else if(!cnt[2])
    {
        if(cnt[1]<3||(cnt[1]>=3&&cnt[0]%2==0))return false;
    }
    else if(cnt[0])
    {
        if(cnt[1]==1&&cnt[1]==cnt[2])
        {
            if(cnt[0]&1)return false;
        }
        else if(max(cnt[1],cnt[2])-min(cnt[1],cnt[2])<=2)
        {
            if(cnt[0]&1)return false;
        }
    }
    return true;
}
相关推荐
sylviiiiiia2 小时前
leetcode hot100
python·算法·leetcode
Nil2083 小时前
leetcode 46全排列
算法·leetcode·职场和发展
辰烨chenye3 小时前
LeetCode Hot 100 题解 · 动态规划篇
算法·leetcode·动态规划
青山木4 小时前
Hot 100 --- 买卖股票的最佳时机
java·数据结构·算法·leetcode·贪心算法
aqiu11111114 小时前
【LeetCode 902】最大为 N 的数字组合 - 详细题解与数位组合思路
数据结构·算法·leetcode·蓝桥杯·数位dp
辰烨chenye15 小时前
LeetCode Hot 100 题解 · 哈希篇
算法·leetcode·哈希算法
玖玥拾16 小时前
LeetCode 219 存在重复元素 II
算法·leetcode·哈希算法·散列表
a1879272183118 小时前
【算法】动态规划第四篇:背包收官——min 哨兵、计数世界与组合排列分水岭
算法·leetcode·动态规划·dp·01背包·算法讲解·决策合并