这个题是我调试时间最长的一道,帮助理解了贪心策略
class Solution {
private:
bool canDone(vector<int>& time, int m, int T){
int day=0;
int worktime=0;
int len = time.size();
bool help = true;//true表示可求助
bool notendofday=true;
int start = 0;
//注意,每天求助的题目,不是当前完成不了的题目,而是当前这一天耗时最多的题目!!!
//我在这个地方耗了两个小时
//下边的两行测试数据的注释就是在解释,要选择最耗时的题目进行求助。
for(int i=0;i<len;){
int tmp = worktime+time[i];
if(tmp>T){
if(help){
notendofday = true;
//if(i>0 && worktime!=0){worktime = tmp - max(time[i-1], time[i]);} //输入[82,35,6,53,37,75,69,69,53,18] 4, 输出 71
if(i>0 && worktime!=0){//[64,5,71,34,90,39,90,53,65,85] 1,输出 506
int temp = time[start];
for(int j=start+1;j<=i;j++){
temp = max(time[j], temp);
}
worktime = tmp-temp;
}
help=false; i++;
}else{
day++; worktime=0; help=true; notendofday = false;start = i;
}
}else{
notendofday = true; worktime = tmp; i++;
}
}
if(notendofday==true)day++;
return day<=m;
}
public:
int minTime(vector<int>& time, int m) {
//sort(time.begin(), time.end());
canDone(time, m, 506);
int l=0, r=0;
for(auto t:time)r+=t;
while(l<r){
int mid = (l+r)>>1;
if(canDone(time, m, mid)==true)r=mid;
else l=mid+1;
}
return l;
}
};