【算法竞赛进阶指南】POJ2018Best Cow Fences

二分法查询答案

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
double a[100005],b[100005],sum[100005];

int main(){
    int n,L;
    cin>>n>>L;
    for(int i=1;i<=n;i++) scanf("%lf",&a[i]);
    double eps=1e-5;
    double l=-1e6,r=1e6;
    while(r-l>eps){
        double mid=(r+l)/2;
        for(int i=1;i<=n;i++) b[i]=a[i]-mid;
        for(int i=1;i<=n;i++) sum[i]=sum[i-1]+b[i];
        double ans=-1e10,minval=1e10;
        for(int i=L;i<=n;i++){
            minval=min(minval,sum[i-L]);
            ans=max(ans,sum[i]-minval);
        }
        if(ans>=0) l=mid; else r=mid;
    }
    cout<<int(r*1000)<<endl;
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/rign/p/10060127.html