分析
把老板生气时的下标加入到队列q中,把不生气的所有值加起来。
枚举q中每个元素,计算以q[i]为首个下标,长度为X的数组的总和,如果得到的值比ans大,就更新ans。
最后返回ans。
C++ 代码
class Solution {
public:
int ans,hh,tt=-1;
int maxSatisfied(vector<int>& customers, vector<int>& grumpy, int X) {
int n=customers.size();
int q[n+1];
for(int i=0;i<n;i++)
{
if(!grumpy[i]) //老板不生气,计算总和
ans+=customers[i];
else
q[++tt]=i; //老板生气,下标加入队列q
}
int res=ans;
while(hh<=tt) //枚举q中每个元素
{
auto t=q[hh++];
int temp=0;
for(int i=t,j=0;(i<n && j<X);i++,j++) //计算以q[i]为首下标,长度为X的数组和
{
if(grumpy[i]) //加上老板生气时的顾客数
temp+=customers[i];
}
if(res+temp>ans) //更新答案
ans=res+temp;
}
return ans;
}
};