BZOJ_3477_[Usaco2014 Mar]Sabotage_二分答案

BZOJ_3477_[Usaco2014 Mar]Sabotage_二分答案

题意:

约翰的牧场里有 N 台机器,第 i 台机器的工作能力为 Ai。保罗阴谋破坏一些机器,使得约翰的工作效率变低。保罗可以任意选取一段编号连续的机器,使它们停止工作。但这样的破次,而且保罗无法破坏第一台或最后一台机器。请问他该破坏哪些机器才能让剩下机器的工作效率的平均数最小?为了显示存在感,保罗至少必须破坏一台机器。

分析:

二分出答案k,将a[i]-k,求出2到n-1最大子段和mx。用sum-mx既是剩下的前一段后一段的和。如果小于0则是合法的。

代码:

#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define N 100050
#define du double 
int a[N],n;
du sum;
bool check(du x)
{
    du ans=-100000,f=-100000;
    for(int i=2;i<n;i++)
    {
        du now=a[i]-x;
        f=max(now,f+now);
        ans=max(ans,f);
    }
    if(sum-x*n-ans<=0)return 1;
    return 0;
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
        sum+=a[i];
    }
    du l=0,r=1000000;
    for(int i=1;i<=60;i++)
    {
        du mid=(l+r)*0.5;
        if(check(mid))r=mid;
        else l=mid; 
    }
    printf("%.3lf",l);
}

 

 

posted @ 2018-02-09 19:34  fcwww  阅读(197)  评论(0编辑  收藏  举报