1. 题目
2. 思路
(1) 博弈论
- 只需将石子分成三类即可,即除3余0、1、2的石子,每次累加的和也都对3取余。
- 若和为0,则游戏直接结束,因此,在游戏结束前,和要么为1,要么为2。
- 游戏结束前,当取出与和相等的石子时,和会在1和2之间互换;当取出余0的石子时,等于交换了一次先后手的顺序;当取出与和不等的石子时,则游戏结束。
- 若余0的石子个数是偶数,则先后手顺序不变,而A必然要先取一个1或者2且取完还有剩的才能保证自己是必胜的。
- 若余0的石子个数是奇数,则相当于B先手,只有当1和2的个数差大于2才能保证A必胜。
3. 代码
public class Test {
public static void main(String[] args) {
}
}
class Solution {
public boolean stoneGameIX(int[] stones) {
int[] count = new int[3];
for (int stone : stones) {
count[stone % 3]++;
}
if ((count[0] & 1) == 0) {
return count[1] >= 1 && count[2] >= 1;
}
return Math.abs(count[1] - count[2]) > 2;
}
}