1124. 表现良好的最长时间段
给你一份工作时间表 hours,上面记录着某一位员工每天的工作小时数。
我们认为当员工一天中的工作小时数大于 8 小时的时候,那么这一天就是「劳累的一天」。
所谓「表现良好的时间段」,意味在这段时间内,「劳累的天数」是严格 大于「不劳累的天数」。
请你返回「表现良好时间段」的最大长度。
class Solution {
public:
int longestWPI(vector<int>& hours) {
int remain = 0; // 标记连续工作n天多余的工作小时数
int start = 0; // 从第零天起
int maxDay = 0; // 最大的工作天数
int allHours = 0; // 连续n天总的工作小时数
int res = 0;
while(start<hours.size())
{
// 寻找第一个大于8小时的那一天
if(hours[start]>=8){
break;
}
start++;
}
if(start == hours.size()){
// 如果没有找打大于8的那一天,则这是个废物员工
cout<<"res"<<endl;
return 0;
}
int end = start;
maxDay =1;
res = maxDay;
allHours = hours[start];
remain = allHours - maxDay*8;
while(end<hours.size()) // 寻找连续天数
{
if(maxDay>res)
{
res = maxDay;
}
if(start == end+1)
{
while(start<hours.size())
{
// 寻找第一个大于8小时的那一天
if(hours[start]>8){
int end = start;
maxDay =1;
allHours = hours[start];
remain = allHours- maxDay*8;
break;
}
start++;
}
}
end++;
if(hours[end]>=8){
maxDay+=1;
allHours+=hours[end];
remain = allHours-maxDay*8;
}
else
{
// 这一天小于8小时,那么看前面的时间是否有剩余分配过来
if(remain+hours[end]>=8)
{
cout<<3<<endl;
// 有剩余,可继续保持
maxDay+=1;
allHours+=hours[end];
remain = allHours-maxDay*8;
}
else
{
// 没有剩余,说明在这一天断了,查看从起始天数开始,有没有托节奏的一天
while(start<end)
{
if((allHours/maxDay)>hours[start])
{
// 如果第一天托节奏了,那么就去除第一天的
maxDay--;
allHours-=hours[start];
remain = allHours-maxDay*8;
start++;
}
else{
// 这一天没有托节奏并且提供了很多盈余的小时,那么这段时间不再连续,即重设天数
start = end+1;
break;
}
}
}
}
}
return res;
}
};