子序列的平均值

题目描述:
给定一个长度为n的非负序列A,请你找出一个长度不小于L的子段(子段是序列A中一些连续的元素构成的集合),使得子段中数值的平均值最大。最终输出这个最大的平均值。

输入格式:
第一行两个整数n,L(1<=L<=n<=100,000)

以下n行,每行一个非负整数,表示序列A中每个元素的值。

输出格式:
一个整数,欲求的最大平均值乘以1000后的结果(注意不要四舍五入,直接输出)。

输入样例:

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

输出样例:

6500

收获:
通过这道题
1.学会了二分答案
2.学会了长度>=n的序列前缀和的最大值枚举的求解的优化方法

解题思路:
1.二分答案: l = 0, r = 1e9;
2.check的标准: 序列和 / L 如果大于mid,说明平均值可以更大l = mid;
如果小于mid,说明平均值不够这么大r = mid;
3.题的范围10e5,一般都是nlogn。二分的时候已经logn了,所以check的时候必须在O(n)时间内完成。
如果正常判断从L到n,每层判断是否满足,肯定超时了,需要双层循环,这里用到了一个很妙的想法

在这里插入图片描述因为只要有一个满足条件,就check成功,所以可以这样转化

for(int i = L; i <= n; i ++ ){
   
		min_s = min(min_s, sum[i - L]);
		if(sum[i] - min_s >= 0){
   
			return 1;
		
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值