日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Leetcode 2029. 石子游戏 IX

發(fā)布時(shí)間:2023/12/18 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Leetcode 2029. 石子游戏 IX 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Alice 和 Bob 再次設(shè)計(jì)了一款新的石子游戲。現(xiàn)有一行 n 個(gè)石子,每個(gè)石子都有一個(gè)關(guān)聯(lián)的數(shù)字表示它的價(jià)值。給你一個(gè)整數(shù)數(shù)組?stones?,其中?stones[i]?是第?i?個(gè)石子的價(jià)值。

Alice 和 Bob 輪流進(jìn)行自己的回合,Alice?先手。每一回合,玩家需要從?stones?中移除任一石子。

  • 如果玩家移除石子后,導(dǎo)致?所有已移除石子?的價(jià)值?總和?可以被 3 整除,那么該玩家就?輸?shù)粲螒?/strong>?。
  • 如果不滿足上一條,且移除后沒(méi)有任何剩余的石子,那么 Bob 將會(huì)直接獲勝(即便是在 Alice 的回合)。

假設(shè)兩位玩家均采用?最佳?決策。如果 Alice 獲勝,返回?true?;如果 Bob 獲勝,返回?false?。

示例 1:

輸入:stones = [2,1] 輸出:true 解釋:游戲進(jìn)行如下: - 回合 1:Alice 可以移除任意一個(gè)石子。 - 回合 2:Bob 移除剩下的石子。 已移除的石子的值總和為 1 + 2 = 3 且可以被 3 整除。因此,Bob 輸,Alice 獲勝。

示例 2:

輸入:stones = [2] 輸出:false 解釋:Alice 會(huì)移除唯一一個(gè)石子,已移除石子的值總和為 2 。 由于所有石子都已移除,且值總和無(wú)法被 3 整除,Bob 獲勝。

示例 3:

輸入:stones = [5,1,2,4,3] 輸出:false 解釋:Bob 總會(huì)獲勝。其中一種可能的游戲進(jìn)行方式如下: - 回合 1:Alice 可以移除值為 1 的第 2 個(gè)石子。已移除石子值總和為 1 。 - 回合 2:Bob 可以移除值為 3 的第 5 個(gè)石子。已移除石子值總和為 = 1 + 3 = 4 。 - 回合 3:Alices 可以移除值為 4 的第 4 個(gè)石子。已移除石子值總和為 = 1 + 3 + 4 = 8 。 - 回合 4:Bob 可以移除值為 2 的第 3 個(gè)石子。已移除石子值總和為 = 1 + 3 + 4 + 2 = 10. - 回合 5:Alice 可以移除值為 5 的第 1 個(gè)石子。已移除石子值總和為 = 1 + 3 + 4 + 2 + 5 = 15. Alice 輸?shù)粲螒?#xff0c;因?yàn)橐岩瞥又悼偤?#xff08;15)可以被 3 整除,Bob 獲勝。

提示:

  • 1 <= stones.length <= 105
  • 1 <= stones[i] <= 104

解法:

一開(kāi)始以為需要狀態(tài)壓縮,結(jié)果看過(guò)數(shù)據(jù)范圍就放棄了,最后寫(xiě)了個(gè)dfs+記憶化(死馬當(dāng)活馬醫(yī)),超時(shí)了。在比賽快結(jié)束的時(shí)候才想到將數(shù)據(jù)預(yù)處理為0,1,2;但后續(xù)處理還是沒(méi)想出來(lái)。看了題解,然后按自己的理解,寫(xiě)了一個(gè)由許多if-else的解法。

class Solution {bool check(int s0, int s1, int s2){bool flag = true;if (s1 == 0) //當(dāng)s1為0時(shí){if (s2 >= 3) //當(dāng)大于3時(shí),{flag = false; //3個(gè)s2必能被3整除if ((s0 & 1) == 1) //s0為奇數(shù)時(shí)才能改變結(jié)果flag = true;return flag;}else //s2=1,2都是Bob贏{return false;}}else{s1 -= 1; //先手選s1int num = min(s1, s2);s1 -= num, s2 -= num;//后面必定是s1與s2的循環(huán),如當(dāng)s1為1的個(gè)數(shù),1121212...12if (s2 != 0) //去掉循環(huán)后,剩下s2{flag=true; //B取S2,則A贏if ((s0 & 1) == 1) //當(dāng)0的個(gè)數(shù)為奇數(shù)個(gè),才能改變flag = false;return flag;}else //剩下s1{if (s1 <= 1) //不論誰(shuí)取光,都是Bob贏return false; else if (s1 >= 2)//最開(kāi)始的s1,再加上兩個(gè)s1,必能被整除(3%3,6%3){flag = false; //A取完,就能被整除了if ((s0 & 1) == 1)// 當(dāng)0的個(gè)數(shù)為奇數(shù)個(gè),才能改變flag = true;return flag;}}}return flag; //不會(huì)到這里,這里要是不寫(xiě),leetcod}public:bool stoneGameIX(vector<int>& stones) {int s0 = 0, s1 = 0, s2 = 0;for (auto &stone : stones){if (stone % 3 == 0)++s0;else if (stone % 3 == 1)++s1;else++s2;}if (s1 == 0 && s2 == 0)return false;return check(s0, s1, s2) || check(s0, s2, s1); //先手選擇1,或者0} };

看別人的題解總結(jié)一下,讓自己下次遇到能快速寫(xiě)出來(lái):由check()代碼中可以看出Alice要贏只有三種情況:

1.S0為奇數(shù):(1)s1==0,s2>=3(2)s1>s2+2,這兩種可以整合為s1>s2+2

2.S0為偶數(shù):s2>=s1

那么從整體代碼中看即為

bool stoneGameIX(vector<int>& stones) {int s0 = 0, s1 = 0, s2 = 0;for (auto &stone : stones){if (stone % 3 == 0)++s0;else if (stone % 3 == 1)++s1;else++s2;}if((s0&1)==0)return s1!=0&&s2!=0;else return s1>s2+2||s2>s1+2;}

總結(jié)

以上是生活随笔為你收集整理的Leetcode 2029. 石子游戏 IX的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。