0
点赞
收藏
分享

微信扫一扫

LeetCode刷题——2029. 石子游戏 IX

三维控件研究 2022-01-20 阅读 76
leetcode

分析

这里将石子代表的数字转换为余数,即0、1、2,将Alice 和 Bob 设为A和B进行讨论

那么取石头的过程的两种情况是

先取1:

已取出的石子总和的3的余数121212
取出石子的过程112121

先取2:

已取出的石子总和的3的余数212121
取出石子的过程221212

可以发现无论那种情况都要先去取两次一样的石子,不考虑0的情况A赢的情况如下:
1、当1的个数为1时,2的个数大于0时A赢
2、当1的个数为2时,2的个数大于0时A赢
3、当1的个数大于等于2并且个数不大于2的个数,A赢
4、当2的个数为1时,1的个数大于0时A赢
5、当2的个数为2时,1的个数大于0时A赢
6、当2的个数大于等于2并且个数不大于1的个数,A赢
从中可以看出

A赢得条件为1的个数大于0,2的个数大于0

当0的个数为偶数,不造成影响
当0的个数为奇数相当于互换先后手,这时A赢的情况按照前面的考虑方式就会很麻烦,所以我们从表格入手,如果按照最佳的选择,那么一定是按照表格的循环进行的,因为我们要得到A赢的结果,所以我们要在循环结束之前让B取不到应取的数,再考虑0的个数是奇数,所以我们即从表中找到使得A取不到应取的数的情况即可

1、1的个数比2的个数多至少2个
2、2的个数比1的个数多至少2个

代码

class Solution {
public:
    bool stoneGameIX(vector<int>& stones) {
        int cnt[3]={0,0,0};
        for(int i=0; i < stones.size(); i++){
            cnt[stones[i]%3]++;
        }
        if(cnt[0] % 2 == 0){
            return cnt[1] >= 1 && cnt[2] >=1;
        }else{
            return cnt[1] - cnt[2] > 2 || cnt[2] - cnt[1] > 2;
        }
    }
};
举报

相关推荐

0 条评论