其他分享
首页 > 其他分享> > 石子游戏 IX——一场关于模运算加和规律的博弈

石子游戏 IX——一场关于模运算加和规律的博弈

作者:互联网

文章目录


无关紧要的图片

题目描述


题目链接

题目解析

假设先手者名为 A ,后手者名为 B

由于只关注是否取完 和 数字和是否 %3==0,我们把这题要取的数字分为三种:

  1. %3==0 的数字( 0类型 ):只要不是第一次取数,并不会对整个数字的和模产生任何影响。

  2. %3 ==1 的数字( 1类型 ):一旦数字和的模已经是2,则游戏结束,只有数字和的模为1才能继续游戏。

  3. %3==2 的数字( 2类型 ):同上个类型,只有数字和的模与当前数字的模相同才能继续游戏。

根据以上分析:

一、若 0类型 的数字为偶数个,由于 A 先手必不可能选择这类数字,所以 0类型 的数字不会对结果产生任何影响

二、若 0类型 的数字个数为奇数个,同样由于 A 不可能先手取这类数字,但这次由于这类数字是奇数个,可以多出一个来用于替 B 挡灾。

根据以上互换身份的原理, A 在这种情况下,只有选数量多的才能有一线生机,而且至少要比 B 多三份物资,原因在于:

  1. 发生转化的过程还是要消耗掉 1 个
  2. 想要让 A 赢,除了让 BM 个物资消耗完以外,A 自身还需要留下一份物资供 B 产生3的倍数
  3. 此时的对拼消耗过程中 A 处于先手消耗,想要轮到 B 的回合则永远会多消耗一个物资,如 A:2 2 2,B:1 1,对拼过程中明显无法回到B就消耗完了。

假设此时 A 选择的这个类型有 N 个,对方的有 M 个,故只要满足 N − 3 > = M N-3>=M N−3>=M 则 A 必胜,否则还是 B 胜。

因为上面的 N 和 M 所代表的只是 1类型2类型 中数量多和少的类型。故放入题中需要满足的就是 1类型2类型 之间的数量差大于等于3

解题代码

class Solution {
public:
    bool stoneGameIX(vector<int>& stones) {
        int cnt[3]{};
        for (int val: stones) {
            cnt[val%3]++;
        }
        if (cnt[0] % 2 == 0) {//TODO 0类型为偶数的情况
            return cnt[1] >= 1 && cnt[2] >= 1;
        }
        return cnt[1] - cnt[2] >= 3 || cnt[2] - cnt[1] >= 3;//TODO 0类型为奇数的情况
    }
};

标签:IX,cnt,运算,假设,石子,个数,消耗,类型,数字
来源: https://blog.csdn.net/m0_50945504/article/details/122606959