题目
有点像操作系统的任务调度。
解题思路
- 完成全部任务的情况:
我们假设最大任务量刚好与剩余任务总量相等,那么此时可以以(1次最大任务 + 1次剩余任务)搭配完成全部任务。若最大任务量小于剩余任务总量,我们先对除最大值部分进行内部消耗,将其消耗到和最大值一样大,这样就可以全部完成了。 - 只能完成部分任务的情况:
当我们的最大任务量大于剩余任务量,则无论怎么搭配都无法完成所有任务,最终总会剩余最大任务量-剩余任务量,所以此时完成的任务量为 2*sum+1(先完成最大的,再完成其他的,然后最后又回到最大的完成一次,就没有其他的可以完成了)
解题代码
class Solution {
public:
long long numberOfWeeks(vector<int>& milestones) {
using ll = long long;
ll sum = 0;
ll mx = 0;
for(const auto& t:milestones){
sum += t;
mx = max(mx,(ll)t);
}
if(sum-mx<mx)
return 2*(sum-mx)+1;
return sum;
}
};