爱生气的书店老板

爱生气的书店老板

一天,书店老板有一家店打算试营length(customers.lenght)分钟,
每分钟都会有一些顾客(customers[i])进入书店,所有的顾客只会待一分钟就离开。
在某些时候老板会生气,如果老板在第i分钟生气,那么生气了就有grumpy[i] =1,否则 groupy[i]=0;
当书店老板生气时,那一分钟的顾客就会不满意,不生气则他们是满意的;
书店老板知道一个秘密技巧,能抑制自己的情绪,可以让自己连续不生气X分钟 ,但却只能使用一次。

问这一天营业下来,最多有多少客户感到满意的数量?

示例:
输入:customers=[1,0,1,2,1,1,7,5], grumpy=[0,1,0,1,0,1,0,1],X=3
输出:16
解释:
书店老板在最后3分钟保持冷静。 感到满意的最大客户数量=1+1+1+1+7+5=16.

解题思路:
1、如果老板不生气,那么顾客肯定是满意的,我们先计算所有的满意数量。
2、如果老板生气,那么顾客肯定是不满意的,这些不满意的构成一个新的数组。转化为在这个数组中找出连续的K分钟(K窗口)的最大值!!!
代码演示:

/***********************************************************
*版权所有:(C) 2021.7.22  烽火编程(第八方面军) 
* 
*文件名称:爱生气的书店老板 
*内容摘要:滑动窗口最大值 
*当前版本:1-1 
*文件作者:帅子牛 
*完成日期:2021.7.27
*
*修改记录:暂无 
***********************************************************/ 
#include <stdio.h>
#define N 8			//人群分8波进入书店 
int fun(int customers[],int grumpy[],int X){
    
    
	int satisfied=0;//本来就满意的人数 
	int length = N; 
	int nosatisfied[N]={
    
    0};
	int i;
	for(i=0;i<length;i++){
    
    
		if(grumpy[i]==0){
    
    
			satisfied += customers[i];//满意的人数 
		}else{
    
    
			nosatisfied[i] = customers[i]*grumpy[i];//不满意的人数 
		}
	}
	int left = 0,right = 0;
	int max = 0,sum = 0;
	for(right=0;right<length;right++){
    
    
		sum += nosatisfied[right];
		//如果窗口长度超过X,要减去窗口左边的值,同时窗口左边右移一步 
		if(right-left>=X){
    
    
			sum -= nosatisfied[left++];
		}
		max = max>sum?max:sum;
	} 
return satisfied+max; 
} 
int main() {
    
    
	
	int customers[N]={
    
    1,0,1,2,1,1,7,5};//顾客人数 
	int grumpy[N]={
    
    0,1,0,1,0,1,0,1};//老板发脾气的情况 
	int X=3;//书店老板可以控制的的时间时长 
	int MAX = fun(customers,grumpy,X);
	printf("最多有%d个客户感到满意",MAX); 
	return 0;	
}

猜你喜欢

转载自blog.csdn.net/m0_46672781/article/details/119118607
今日推荐