法一
int maxSatisfied(vector<int>& customers, vector<int>& grumpy, int X) {
if(customers.size()==0)return 0;
int k=0;
vector<int> temp1(customers.size()-X+1,0),temp2(customers.size()-X+1,0);
for(int i=0;i<customers.size();i++){
k+=customers[i]*(1-grumpy[i]);//无技能满意度
}
for(int i=0;i<customers.size()-X+1;i++){
for(int j=i;j<i+X;j++){
temp1[i]+=customers[j];//每X位有技能满意度
temp2[i]+=customers[j]*(1-grumpy[j]);//每X位无技能满意度
}
temp2[i]=temp1[i]-temp2[i];//保存差值
}
int max=temp2[0];
for(int i=1;i<temp2.size();i++){
if(temp2[i]>max)max=temp2[i];//取差值最大
}
return max+k;//相加
}
};
法二(利用滑动窗口)
#laugh计算无技能时满意度
#angry列出不满意度
#通过滑动窗口思想以X为一组,每次移一位,+新位-旧位,选最大不满意度
#无技能时满意度+最大不满意读
class Solution {
public:
int maxSatisfied(vector<int>& customers, vector<int>& grumpy, int X) {
vector<int> angry(customers.size(),0),laugh(customers.size(),0);
int max=0,temp=0,sum=0;
for(int i=0;i<customers.size();i++){
angry[i] = customers[i]*grumpy[i];
laugh[i] = customers[i]*(1-grumpy[i]);
sum += laugh[i];
}
for(int i=0;i<X;i++){
max+=angry[i];
}
temp = max;
for(int i=X;j<customers.size();i++){
temp += angry[i] - angry[i-X];//加新减旧
if(temp>max)max = temp;
}
return sum+max;
}
};
``