分析
这里将石子代表的数字转换为余数,即0、1、2,将Alice 和 Bob 设为A和B进行讨论
那么取石头的过程的两种情况是
先取1:
已取出的石子总和的3的余数 | 1 | 2 | 1 | 2 | 1 | 2 | … |
---|---|---|---|---|---|---|---|
取出石子的过程 | 1 | 1 | 2 | 1 | 2 | 1 | … |
先取2:
已取出的石子总和的3的余数 | 2 | 1 | 2 | 1 | 2 | 1 | … |
---|---|---|---|---|---|---|---|
取出石子的过程 | 2 | 2 | 1 | 2 | 1 | 2 | … |
可以发现无论那种情况都要先去取两次一样的石子,不考虑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;
}
}
};