题目链接:
题意:有n朵花,有m天,每一天可以对第i朵花浇水,会影响到[i,i+w-1]区间里的花,使他们长高1长度,求m天后所有花里最矮的花的高度最大值(写的好绕口啊……)
思路:因为求得是所有花里最矮的最大值……所以区间一定在[min,max+m]里所以用二分就可以了,然后对每一朵高度不够的花进行浇水操作,利用hei数组记录停止影响的花朵,变量day记录浇水的天数
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define maxn 100030
#define inf 0x3f3f3f3f
using namespace std;
int s[maxn],hei[maxn];
int n,m,w;
int jde(int gold)
{
memset(hei,0,sizeof(hei));
int day=0,kot=m;
for (int i=0;i<n;i++)
{
day+=hei[i];
if (s[i]+day<gold)
{
int tem=gold-s[i]-day;
if (i+w<n)hei[i+w]-=tem;
kot-=tem;
day+=tem;
if (kot<0) return 0;
}
}
return 1;
}
int main()
{
while (scanf("%d%d%d",&n,&m,&w)!=EOF)
{
int r=-inf,l=inf,res;
for (int i=0;i<n;i++)
{
scanf("%d",&s[i]);
r=max(r,s[i]);
l=min(l,s[i]);
}
r+=m;
res=l;
while (l<=r)
{
int mid=(r+l)>>1;
if (jde(mid))
{
l=mid+1;
res=max(mid,res);
}
else
{
r=mid-1;
}
}
printf("%d\n",res);
}
}