问:今书 店 老 板 有 一 家 店 打 算 试 营 业 cus tomer [s] . length 分 钟 。 每 分 钟 都 有 一 些 顾 客 (cus tomer s [i])会进入书店,所有这些顾客都会在那一分钟结束后离开。 在某些时候,书店老板会生气。如果书店老板在第i分钟生气,那么 grumpy [i]=1,否 则grumpy [i]=0。当书店老板生气时,那一分钟的顾客就会不满意,不生气则他们是满 意的。 书店老板知道一个秘密技巧,能抑制自己的情绪,可以让自己连续X分钟不生气,但却只 能使用一次。 请你返回这一天营业下来,最多有多少客户能够感到满意的数量。
分析:只需要找到customers[]连续x个值的和最大即可,窗口即为X。遍历从数组0位置到 length-x+1位置,每次右滑动一次且计算窗口内的值,并且选出最大的。
public class bookstory {
public static void main(String[] args) {
// TODO Auto-generated method stub
int customers[]= {1,2,1,2,1,1,7,5};//客人每分钟的数量
int grumpy[]= {0,1,0,1,0,1,0,1};//老板的脾气在每分钟的分布
int max_patience=3;//老板忍住不发脾气的最长时间
int max_customer=0;//最多能留下的客人数
int max_patience_customers=0;//最多在耐心值下留下的客人数
int log=0;//
for(int i=0;i<customers.length-max_patience+1;i++)//算出最大耐心范围内客人数量最多的数量
//与第一个在数组的位置Log
{//三个一个窗口 计算一次右滑一次 并记最大窗口时第一个数的位置为log
int sum=0;
for(int j=i;j<i+max_patience;j++)
{
sum=sum+customers[j];
}
if(max_patience_customers<=sum)
{
max_patience_customers=sum;
log=i;
}
}
for(int i=0;i<customers.length;i++)//计算最多客人数
{
if(log<=i&&i<log+max_patience)//在最大窗口内的算法
{
max_customer=max_customer+customers[i];
}
else
max_customer=max_customer+customers[i]*grumpy[i];
}
System.out.println("最多的客人为:"+max_customer+"个");
}
}