1. 問題描述:
為了提高自己的**能力,小張制定了 leetcode 刷題計畫,他選中了 leetcode 題庫中的 n 道題,編號從 0 到 n-1,並計畫在 m 天內按照題目編號順序刷完所有的題目(注意,小張不能用多天完成同一題)。
在小張刷題計畫中,小張需要用 time[i] 的時間完成編號 i 的題目。此外,小張還可以使用場外求助功能,通過詢問他的好朋友小楊題目的解法,可以省去該題的做題時間。為了防止「小張刷題計畫」變成「小楊刷題計畫」,小張每天最多使用一次求助。
我們定義 m 天中做題時間最多的一天耗時為 t(小楊完成的題目不計入做題總時間)。請你幫小張求出最小的 t是多少。
示例 1:
輸入:time = [1,2,3,3], m = 2
輸出:3
解釋:第一天小張完成前三題,其中第三題找小楊幫忙;第二天完成第四題,並且找小楊幫忙。這樣做題時間最多的一天花費了 3 的時間,並且這個值是最小的。
示例 2:
輸入:time = [999,999,999], m = 4
輸出:0
解釋:在前三天中,小張每天求助小楊一次,這樣他可以在三天內完成所有的題目並不花任何時間。
限制:
2. 思路分析:
① 仔細分析這道題目可以知道我們需要在乙個範圍之內查詢最終的答案,所以可以知道這個題目其實是乙個二分查詢的模型,(感覺分析題目為二分查詢的模型其實也是乙個難點),首先需要制定二分查詢的策略,可以知道我們檢查當前花費t時間是否可以在m天完成之內即可,對於大部分題目都是類似的,二分查詢的基本上都是根據我們求解的答案來查詢的,這道題目的答案其實是最終花費的最少的時間,所以我們二分查詢的範圍就是時間,由題目可以知道最小的範圍為0,最大的範圍為time陣列的元素之和,確定好了範圍之後我們就可以在這個範圍內查詢,當判斷出花費時間為mid的可以在m天之內可以完成那麼我們就要縮小右邊界因為可能時間會更小,不能在m天之內完成那麼就需要擴大左邊界
② 檢查是否能夠在m天之內完成我們可以根據題目的條件進行模擬,我們需要使用乙個變數來累加遍歷的陣列元素之和,這樣可以判斷總和是否超出了mid花費時間,假如超過了那麼我們看當前有沒有求助的機會假如有那麼使用求助機會,求助的時候我們需要將到當前位置花費時間最大的進行求助這樣才可以使得最終花費的時間最短,所以我們需要宣告乙個變數來記錄到當前位置元素的最大值,這樣當有求助機會的時候那麼那麼求助的為耗時最大的題目,假如用完了求助的幾乎那麼我們需要開啟新的一天,並且將之間累計求和與記錄到當前最大值的變數重置為0,這個時候我們就需要重新完成之前那道題目了
③ 其實感覺就是翻譯題目的過程,最核心的是需要弄清楚使用二分查詢來解決
3. **如下:
from typing import list
class solution:
def check(self, time: list[int], m: int, mid: int):
# 一開始的天數肯定是為1的
days = 1
sum, maxcost, chancetohelp, i = 0, 0, 1, 0
while i < len(time):
# 找出耗時最大的
maxcost = max(maxcost, time[i])
sum += time[i]
# 超出了最大的耗時
if sum > mid:
# 有求助的機會
if chancetohelp:
# 貪心: 求助耗時最大的那乙個
sum -= maxcost
chancetohelp = 0
else:
# 沒有求助機會了, 需要開啟新的一天
maxcost = 0
sum = 0
days += 1
chancetohelp = 1
# 重新做當前這道累加超時的題目
i -= 1
i += 1
return days <= m
def mintime(self, time: list[int], m: int) -> int:
l, r = 0, sum(time)
res = r
while l <= r:
mid = (l + r) // 2
if self.check(time, m, mid):
res = mid
r = mid - 1
else:
l = mid + 1
return res
LCP12 小張刷題計畫
題目 題意 將乙個陣列分為m份,其中最大個數的那乙份元素之和t要最小。官方題解 如果不考慮每份可以任意減去乙個元素,就是乙個經典的二分問題,具有單調最優的性質 如果最大值為 t可以滿足條件劃分,那麼最大值為t 1也可以。所以就直接二分最大值t,找到最小滿足條件的t即可。本題加了乙個條件 每份可以刪除...
LCP 12 小張刷題計畫 二分法的擴充套件
提高自己的 能力,小張制定了 leetcode 刷題計畫,他選中了 leetcode 題庫中的 n 道題,編號從 0 到 n 1,並計畫在 m 天內按照題目編號順序刷完所有的題目 注意,小張不能用多天完成同一題 在小張刷題計畫中,小張需要用 time i 的時間完成編號 i 的題目。此外,小張還可以...
二分 B019 LC 小張刷題計畫(貪婪)
n 道題,編號從 0 到 n 1,並計畫在 m 天內按照題目編號順序刷完所有的題目 注意,小張不能用多天完成同一題 在小張刷題計畫中,小張需要用 time i 的時間完成編號 i 的題目。此外,小張還可以使用場外求助功能,通過詢問他的好朋友小楊題目的解法,可以省去該題的做題時間。為了防止 小張刷題計...