[luogu2115][USACO14MAR]破坏Sabotage(二分)

来源:互联网 发布:淘宝与客服聊天图片 编辑:程序博客网 时间:2024/06/05 11:44

题目:

我是超链接

题解:

二分答案
如果二分的x太大,则sum[n]-(sum[j]-sum[i-1]) / (n-j+i-1) < x
太小:sum[n]-(sum[j]-sum[i-1]) / (n-j+i-1) >= x
然后画一个简单的柿子
以太小为例:sum[n]-sum[j]-nx+jx >=-sum[i-1]+(i-1)x 即如果太小就满足这个柿子,那么一旦右边的max > 左边,就不是太小啊,往大里换

代码:

#include <cstdio>#include <cmath>#include <iostream>using namespace std;const double eps=1e-5;double sum[100005];int n,i;bool check(double x){    double lj=-sum[1]+x;    for (int j=2;j<n;j++)    {        if (sum[n]-sum[j]-n*x+j*x<lj) return false;        lj=max(lj,-sum[j]+j*x);    }    return true;}int main(){    int a;    scanf("%d",&n);    for (i=1;i<=n;i++) scanf("%d",&a),sum[i]=sum[i-1]+a;    double l=1,r=10000;    while (r-l>=eps)    {        double mid=(l+r)/2.0;        if (check(mid)) l=mid;        else r=mid;    }    printf("%.3lf",r);}
原创粉丝点击