本文已参与「新人创作礼」活动,一起开启掘金创作之路。
题目
2029.石子游戏 IX
题目大意
Alice 和 Bob 再次设计了一款新的石子游戏。现有一行 n 个石子,每个石子都有一个关联的数字表示它的价值。给你一个整数数组 stones ,其中 stones[i] 是第 i 个石子的价值。
Alice 和 Bob 轮流进行自己的回合,Alice 先手。每一回合,玩家需要从 stones 中移除任一石子。
- 如果玩家移除石子后,导致 所有已移除石子 的价值 总和 可以被 3 整除,那么该玩家就 输掉游戏 。
- 如果不满足上一条,且移除后没有任何剩余的石子,那么 Bob 将会直接获胜(即便是在 Alice 的回合)。
假设两位玩家均采用 最佳 决策。如果 Alice 获胜,返回 true ;如果 Bob 获胜,返回 false 。
样例
数据规模
思路
根据题意,因为考虑是否是3的倍数,所以可以将,那么。设分别表示的数量。
如果:
那么将不对结果产生影响,原因:一方选择,另一方可以同样选择,最后执行次,被消耗完,但Alice和Bob的顺序不发生改变。所以这种情况下可以忽略的石子,只考虑和。
Alice和Bob的顺序是如何的呢?
- Alice先手选择1,那么Bob必须选择1,然后Alice必须选择2,那么最终顺序就是
- Alice先手选择2,那么Bob必须选择2,然后Alice必须选择1,那么最终顺序就是
那么Alice就选择一个数量少的作为先手,然后交替之后Alice就会一直选择数量多的,而Bob只能选择数量少的,这样Alice是必胜。注意必须保证
如果:
那么胜负情况等价于只有1个的石子组合类型的胜负情况。注意这里不能等价于[没有的石子组合类型的胜负情况]的相反情况,这是因为如果所有的石子都被移除完,无论谁移除了最后一个石子,都算 Alice 输。因此如果 Alice 发现自己选择的石子不能获胜,于是选择移除类型0的石子,并且它不能获胜的原因是[石子会移除完],那么 Alice 仍然会输。
所以Alice会选择数量最多的作为先手,然后交替之后Alice就会一直选择数量少的,而Bob只能选择数量少的,但是Alice会选择一个来扭转局面,实现必胜。注意必须保证数量多的-数量少的>=2
代码
class Solution {
public:
bool stoneGameIX(vector<int>& stones) {
int t1=0,t2=0,t0=0;
for(int i=0;i<stones.size();i++){
stones[i]=stones[i]%3;
t1+=(stones[i]==1);
t2+=(stones[i]==2);
t0+=(stones[i]==0);
}
if(t0%2==0){
return t1>=1&&t2>=1;
}
return t1-t2>2||t2-t1>2;
}
};