题解 | #Best Cow Fences#

Best Cow Fences

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

思路

求长度不小于L的平均值最大的子区间。
可以用前缀和+二分的思想去做,复杂度O(nlogn)。
对于每个数减去二分的平均值,并且算出前缀和。
那么我们用一个数记录前i个数中总和最小的区间[0,k],
那么只需要判断前i个数最大区间[0,i]-[0,k]是否大于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;
}
全部评论

相关推荐

点赞 评论 收藏
转发
2 1 评论
分享
正在热议
# 牛客帮帮团来啦!有问必答 #
1153274次浏览 17159人参与
# 通信和硬件还有转码的必要吗 #
11245次浏览 101人参与
# 不去互联网可以去金融科技 #
20868次浏览 259人参与
# 和牛牛一起刷题打卡 #
19137次浏览 1636人参与
# 实习与准备秋招该如何平衡 #
203554次浏览 3629人参与
# 大厂无回复,继续等待还是奔赴小厂 #
5033次浏览 33人参与
# OPPO开奖 #
19368次浏览 268人参与
# 通信硬件薪资爆料 #
266102次浏览 2484人参与
# 国企是理工四大天坑的最好选择吗 #
2236次浏览 34人参与
# 互联网公司评价 #
97773次浏览 1280人参与
# 简历无回复,你会继续海投还是优化再投? #
25041次浏览 354人参与
# 0offer是寒冬太冷还是我太菜 #
454996次浏览 5125人参与
# 国企和大厂硬件兄弟怎么选? #
53932次浏览 1013人参与
# 参加过提前批的机械人,你们还参加秋招么 #
14649次浏览 349人参与
# 硬件人的简历怎么写 #
82299次浏览 852人参与
# 面试被问第一学历差时该怎么回答 #
19415次浏览 213人参与
# 你见过最离谱的招聘要求是什么? #
28610次浏览 249人参与
# 学历对求职的影响 #
161294次浏览 1804人参与
# 你收到了团子的OC了吗 #
538911次浏览 6390人参与
# 你已经投递多少份简历了 #
344360次浏览 4963人参与
# 实习生应该准时下班吗 #
97042次浏览 722人参与
# 听劝,我这个简历该怎么改? #
63530次浏览 622人参与
牛客网
牛客企业服务