1. 程式人生 > >POJ2018-Best Cow Fences【實數二分答案】

POJ2018-Best Cow Fences【實數二分答案】

正題

大意

有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)); }