Re: [閒聊] 每日leetcode

看板Marginalman作者 (caster )時間1年前 (2024/09/02 08:53), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串792/1548 (看更多)
※ 引述《enmeitiryous (enmeitiryous)》之銘言: : 還是要多練下二分搜怎麼寫 : 題目:1894. Find the Student that Will Replace the Chalk : 給你一個vector chalk, chalk[i]代表第i個學生要花費的chalk,給你一個數字k求當學 : 生輪流花費chalk[i]直到k被花光是第幾號位學生(到第n-1號學生若k沒花完則跳回0號 : 思路:一開始想說試下模擬解,但k會到10**9所以是不行的,第二個想到應該是先求出 : prefixsum後,用二分搜找出會落在哪,而輪流這件事可以用k%presum[n-1]解決 : int bs(vector<long long int>& pre_ans,long long int tar){ : int left=0; : int right=pre_ans.size()-1; : int mid; : while(left<right){ : mid=left+(right-left)/2; : if(pre_ans[mid]<=tar){ : left=mid+1; : } : else{ : right=mid; : } : } : return right; : } : int chalkReplacer(vector<int>& chalk, int k) { : int cring=0; : int n=chalk.size(); : vector<long long int> pre_ans(n,0); : pre_ans[0]=chalk[0]; : for(int i=1;i<n;++i){ : pre_ans[i]=pre_ans[i-1]+chalk[i]; : } : if(pre_ans[n-1]>k){ : return bs(pre_ans,k); : } : else{ : return bs(pre_ans,k%pre_ans[n-1]); : } : } 思路: 蝦雞巴寫 本來想暴力解 TLE修一下就變這樣了 應該能再優化 但我懶得想了 Python Code: class Solution: def chalkReplacer(self, chalk: List[int], k: int) -> int: n = sum(chalk) q = k // n k -= n * (q - 1) while k > 0: for i in range(len(chalk)): if k - chalk[i] < 0: return i elif k - chalk[i] == 0: if i + 1 < len(chalk): return i + 1 else: return 0 else: k -= chalk[i] -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 123.194.160.111 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/Marginalman/M.1725238420.A.E1B.html
文章代碼(AID): #1crGoKuR (Marginalman)
討論串 (同標題文章)
文章代碼(AID): #1crGoKuR (Marginalman)