P2115 [USACO14MAR]破坏Sabotage


对平均值的二分,以及实数域二分,思想很好


#include<bits/stdc++.h>
using namespace std;
int n;
double num[100010],t[100010],ma[100010],mi[100010];
int check(double w)
{
    for(int i=0;i<=n;i++)t[i]=num[i]-w*i;
    mi[1]=t[1];ma[n-1]=t[n-1];
    for(int i=2;i<=n;i++)mi[i]=min(mi[i-1],t[i]);
    for(int i=n-2;i>=1;i--)ma[i]=max(ma[i+1],t[i]);
    for(int i=2;i<=n-1;i++)if(ma[i]-mi[i-1]>t[n])return 0;
    return 1;
}
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)cin>>num[i],num[i]+=num[i-1];
    double l=0,r=11000;
    for(int i=1;i<=50;i++)
    {
        double mid=(l+r)/2;
        if(check(mid)){l=mid;}
        else r=mid;
    }
    printf("%.3lf",l);
}
原文地址:https://www.cnblogs.com/SFWR-YOU/p/11437199.html