样例输入:
10 6
6 4 2 10 3 8 5 9 4 1
样例输出:
6500
将原问题转化为: 判定 " 是否存在一个长度不小于L 的区间,区间的平均数不小于二分的值 "
精度问题,请注意!
AC代码:
//是否存在一个长度不小于L的区间,使得平均数不小于二分的值
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#define N 100007
#define inf 0x3f3f3f3f
using namespace std;
const double Eps = 1e-5 ;
inline int wread(){
char c=getchar ();int flag=1,wans=0;
while (c<'0'||c>'9'){if (c=='-') flag=-1;c=getchar ();}
while (c>='0'&&c<='9'){wans=wans*10+c-'0';c=getchar ();}
return wans*=flag;
}
int n,a[N],m;
int l,r;
double b[N]={0};
bool check (int mid){
double x=mid*1.0/1000;
double cmp=inf;
for (int i=1;i<=n;++i){
if (i>=m) cmp=min(cmp,b[i-m]);
b[i]=b[i-1]-x+(double)a[i];
double pr=b[i]-cmp;
if (pr>= -Eps) return true;
}
return false;
}
int main (){
n=wread();m=wread();
l=inf;r=-inf;
for (int i=1;i<=n;++i)
a[i]=wread(),l=min (l,a[i]),r=max(r,a[i]);
l*=1000,r*=1000;
int ans=0;
while (l<=r){
int mid=(l+r)>>1;
if (check (mid)) ans=mid,l=mid+1;
else r=mid-1;
}
printf("%d\n",ans);
return 0;
}