JZX轻语:简
LeetCode 1953 - 你可以工作的最大周数
发表于2024年05月16日
这种任务规划题基本可以考虑利用贪心解决,通过观察发现,可以完成所有工作的充要条件为max_ <= rest + 1
,其中mex_
为耗时最长的工作量,而rest
则为其他的工作量。最优的安排即为将分配工作时间的过程转化为在[1,longest+rest]
闭区间内分配整数的过程,其中每个整数代表对应的一周时间。在分配整数的过程中,首先按照从小到大的顺序分配所有的奇数,然后按照从小到大的顺序分配所有的偶数,这样就可以避免各个数的重复相邻!详细证明可以见官解。
class Solution:
def numberOfWeeks(self, milestones: List[int]) -> int:
# 贪心 + 数学
# 能消耗最多的可能做法: 取max一次 -> 取其他一次 -> 取max一次 -> ...
sum_ = sum(milestones)
max_ = max(milestones)
rest = sum_ - max_
return sum_ if rest + 1 >= max_ else (sum_ - (max_ - rest) + 1)