最佳牛围栏 前缀和,二分

题目

农夫约翰的农场由 N 块田地组成,每块地里都有一定数量的牛,其数量不会少于1头,也不会超过2000头。

约翰希望用围栏将一部分连续的田地围起来,并使得围起来的区域内每块地包含的牛的数量的平均值达到最大。

围起区域内至少需要包含 F 块地,其中 F会在输入中给出。

在给定条件下,计算围起区域内每块地包含的牛的数量的平均值可能的最大值是多少。

输入格式

第一行输入整数 N 和 F ,数据间用空格隔开。

接下来 N 行,每行输出一个整数,第i+1i+1行输出的整数代表,第ii片区域内包含的牛的数目。

输出格式

输出一个整数,表示围起区域内每块地包含的牛的数量的平均值可能的最大值乘以1000得到的数值。

数据范围

1≤N≤100000
1≤F≤N

输入样例:

10 6
6 
4
2
10
3
8
5
9
4
1

输出样例:

6500

代码 

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=1e5+5;
int a[maxn];
double b[maxn];
int n,m;
bool check(double x){
    for(int i=1;i<=n;i++) b[i]=a[i]+b[i-1]-x;
    double minn=1e18;
    double ans=-1e18;
    for(int i=m;i<=n;i++){
        minn=min(minn,b[i-m]);
        ans=max(ans,b[i]-minn);
    }
    return ans>0;
}
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++) cin>>a[i];
    double l=0,r=2001;
    while(r-l>0.000001){
        double mid=(l+r)/2;
        if(check(mid)){
            l=mid;
        }else{
            r=mid;
        }
    }
    printf("%d\n",int(l*1000));
   return 0;
}

 


版权声明:本文为weixin_42757232原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。