POJ2018-Best Cow Fences【實數二分答案】
阿新 • • 發佈:2019-01-10
正題
大意
有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));
}