https://ac.nowcoder.com/acm/problem/50175 二分

Best Cow Fences

https://ac.nowcoder.com/acm/problem/50175

求长度不小于L的平均值最大的子区间。 使用二分+前缀和 对于每个数减去二分的平均值,并且算出前缀和。 那么我们用一个数记录前i个数中总和最小的区间[0,k], 那么只需要判断前i个数最大区间是否大于0即可。

#include<bits/stdc++.h>
#define int long long
using namespace std;
typedef long long ll;

const int maxn=1e5+7;

int n,a[maxn],L;
double b[maxn],sum[maxn];

bool check(double x){
    for(int i=1;i<=n;i++) b[i]=a[i]-x; //新数组
    for(int j=1;j<=n;j++) sum[j]=sum[j-1]+b[j]; //前缀和 
    double minz=0; //记录前i个数最小值 
    for(int i=L;i<=n;i++){ //
        minz=min(minz,sum[i-L]);
        if(sum[i]-minz>=0) return true;
    }
    return false;
}

signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    cin>>n>>L;
     for(int i=1;i<=n;i++){
         cin>>a[i];
        a[i]*=1000;
    }
    double l=0,r=1e15+7,mid;
    while(r-l>1e-5){
        mid=(l+r)/2;
        if(check(mid)) l=mid;//平均值在上 
        else r=mid; //平均值在下 
    }
    cout<<(int)(l+0.0001)<<endl;
    return 0;
}
全部评论

相关推荐

不愿透露姓名的神秘牛友
07-11 11:16
点赞 评论 收藏
分享
点赞 评论 收藏
分享
nus2201602...:兄弟,你这个简历撕了丢了吧,就是一坨,去找几个项目,理解项目流程,看几遍就是你的了,看看八股就去干了,多看看牛客里别人发出来的简历,对着写,你这写的啥啊,纯一坨
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-07 18:05
哈哈哈哈哈感觉朋友找工作的已经疯掉了,直接上图
码农索隆:真老板娘:“我嘞个去,这不我当年的套路吗
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务