LCP 12. 小张刷题计划
最小化最大值问题的基本问题模型。
如果说答案是 T 0 T_0 T0,那么他一定可以在 T 0 + 1 、 T 0 + 2 、 … … T_0+1、T_0+2、…… T0+1、T0+2、……完成这个任务。
反之,如果不行,那么他在 T 0 − 1 、 T 0 − 2 、 … … T_0-1、T_0-2、…… T0−1、T0−2、……也都不可能完成。
而这就满足了二分的两段性。
具体判断时,要判断一个子区间如果去除掉其中的最大值之后能否小于一个阈值,如果超过,就花费了一天。
class Solution {
public:
int m;
int minTime(vector<int>& time, int m) {
this->m = m;
int l = 0, r = 1e9;
while(l<r){
int mid = l+(r-l)/2;
if(ok(mid,time)){
r = mid;
}else{
l = mid+1;
}
}
return l;
}
bool ok(int top,const vector<int> time){
int days = 0, mmax = 0, sum = 0;
for(int i=0;i<time.size();i++){
sum += time[i];
mmax = max(mmax,time[i]);
if(sum-mmax>top){
days++;
sum = 0;
mmax = 0;
i--;
}
}
if(sum>0) days++;
return days<= m;
}
};