2029. 石子游戏 IX
2029. 石子游戲 IX
Alice 和 Bob 再次設計了一款新的石子游戲。現有一行 n 個石子,每個石子都有一個關聯的數字表示它的價值。給你一個整數數組 stones ,其中 stones[i] 是第 i 個石子的價值。
Alice 和 Bob 輪流進行自己的回合,Alice 先手。每一回合,玩家需要從 stones 中移除任一石子。
如果玩家移除石子后,導致 所有已移除石子 的價值 總和 可以被 3 整除,那么該玩家就 輸掉游戲 。
如果不滿足上一條,且移除后沒有任何剩余的石子,那么 Bob 將會直接獲勝(即便是在 Alice 的回合)。
假設兩位玩家均采用 最佳 決策。如果 Alice 獲勝,返回 true ;如果 Bob 獲勝,返回 false 。
解題思路
因為如果玩家移除石子后,導致 所有已移除石子 的價值 總和 可以被 3 整除,那么該玩家就 輸掉游戲 。所以我們已移除石頭和3的整除關系就可以了,所以我們只需要把石頭分為3類,mod3為0,1,2的三類,稱為mod1,mod2和mod3,mod1和mod2兩類的石頭相加必然會被3整除,而已經移除的石頭總數在移除的過程中是不斷變化狀態的,例如原來是mod1狀態,移除一堆mod1狀態的石頭后,就會轉化為mod2狀態,為了使得不產生mod0狀態,Alice和BOb的最佳拿法必然是
Alice先拿mod1或者mod2,以mod1為例,11212121212,產生12循環,0可以隨意穿插,不影響結果,一旦哪一方不能繼續產生12循環,那方就失敗
代碼
class Solution { public:bool stoneGameIX(vector<int> stones) {vector<int> a(3);for (auto i:stones) a[i%3]++;vector<int> b{a[0],a[2],a[1]};return check(a)|check(b);}bool check(vector<int> a){if (a[1]==0) return false;a[1]--;int t=min(a[1],a[2])*2+1+a[0];if (a[1]>a[2]){a[1]--;t++;}return t%2==1&&a[1]!=a[2];} };總結
以上是生活随笔為你收集整理的2029. 石子游戏 IX的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 女人梦到油菜花好不好
- 下一篇: 397. 整数替换