正题
题目链接:http://poj.org/problem?id=2018
大意
有n个数,一段长度不小于L的子段,使他们的平均值最大。
解题思路
二分答案,然后一遍暴力用最大子段和的方法求出是否可以。
code
#include<cstdio>
#include<algorithm>
using namespace std;
int n,m;
double l,r,mid,a[100001],sum[100001];
bool check(double x)
{double sum1=0,sum2=0,ans=-1e10,minv=1e10;for (int i=1;i<=n;i++){sum[i]=sum[i-1]+(a[i]-x);}//取前缀和for (int i=m;i<=n;i++){minv=min(minv,sum[i-m]);//最小下限ans=max(ans,sum[i]-minv);//统计答案}return ans>0;
}
int main()
{scanf("%d%d",&n,&m);for (int i=1;i<=n;i++)scanf("%lf",&a[i]);l=-1e6;r=1e6;double eps=1e-5;while (r-l>eps)//二分答案{mid=(l+r)/2;if(check(mid)) l=mid;else r=mid;}printf("%d",int(r*1000));
}