区间最大平均值

2023-05-16

题目链接:https://www.luogu.com.cn/problem/P1404

题目描述:

给一个长度为 n 的数列,我们需要找出该数列的一个子串,使得子串平均数最大化,并且子串长度≥m。 

输入格式:

第一行两个整数 n 和 m。

接下来 n 行,每行一个整数 ai,表示序列第 i个数字。

输出格式:

一个整数,表示最大平均数的 1000倍,如果末尾有小数,直接舍去,不要用四舍五入求整。

输入样例:

10 6

6

4

2

10

3

8

5

9

4

1

输出样例:6500

数据规模与约定

  • 对于60% 的数据,保证 m≤n≤10^4;
  • 对于100% 的数据,保证 1≤m≤n≤10^5,0≤ai​≤2000。

涉及知识 :前缀法、二分查找 

前缀法

#include<bits/stdc++.h>
using namespace std;
int sum[105],a[105];
int main(){
	int i,n;
	scanf("%d",&n);
	for(i=1;i<=n;i++){
		scanf("%d",&a[i]);
		sum[i]=sum[i-1]+a[i];//sum[i]为前i个数组的前缀和 
	}
	for(i=1;i<=n;i++)
	printf("%d ",sum[i]); 
	return 0;
} 

 二分查找

二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。

时间复杂度 O(log2n)

#include<bits/stdc++.h>
using namespace std;
int main(){
	int n,i,l,r,x,mid;//查找x 
	int a[105]; 
	scanf("%d %d",&n,&x);
	for(i=1;i<=n;i++)
		scanf("%d",&a[i]);
	l=1;r=n;
	while(l!=r){
		mid=(l+r+1)/2;
		if(a[mid]<=x){//如果比中间值大就向右找,否则向左找
			l=mid;
		}else{
			r=mid-1;
		}
	}
	printf("%d\n",l);//输出下标 
	return 0;
} 

思路

本题思路就是先假设一个固定值A,使最大平均值一定大于等于这个固定值

所以这个固定值一定在序列最大值和最小值之间

在序列中存在一段 ai+...+aj 的平均值大于等于A,就相当于 (ai-A)+...+(aj-A) 的平均值大于等于0 ,即 (ai-A)+...+(aj-A) >=0

令 bi=ai-A,问题变成区间求和  bi+...+bj>=0,相当于求前缀和

具体代码如下

#include<bits/stdc++.h>
using namespace std;
#define MAX 2000010
#define ll long long
ll n,m,mid,l,r;
ll a[MAX],b[MAX],sum[MAX];
ll check(ll x){
    for(ll i=1;i<=n;i++){
        b[i]=a[i]-x;//a[i]减掉mid 
        sum[i]=sum[i-1]+b[i];//sum[i]为a[i]减掉mid的前缀和 
    }
    ll y=MAX;
    for(ll i=m;i<=n;i++) {//长度至少为m 
        y=min(y,sum[i-m]);
        if(sum[i]-y>=0) return 1; //平均值是否大于mid 
    }
    return 0;
}
int main(){
    scanf("%lld %lld",&n,&m);
    l=MAX,r=0;
	for(ll i=1;i<=n;i++){
		scanf("%lld",&a[i]);
		a[i]*=1000;
		l=min(l,a[i]);
		r=max(r,a[i]);
		//找到最小值和最大值,最大平均值一定在这之间
	}
    while(l!=r){
        mid=(l+r+1)/2;
        if(check(mid))
			l=mid;//平均值小了扩大 
        else 
			r=mid-1;//平均值大了缩小 
    }
    printf("%lld\n",l); 
    return 0;
}
//洛谷 P1404平均数
//n个元素求长度大于等于m的连续子序列的最大平均值 
//输出:一个整数,表示最大平均数的 1000倍,如果末尾有小数,直接舍去,不要用四舍五入求整


题目链接:https://ac.nowcoder.com/acm/contest/11255/J

题目大意是定义一个矩阵W_{i,j}= a_{i}+b_{j},找一个子矩阵宽度至少x,长度至少y,求子矩阵的最大平均值

问题转化成 : 找 a 的一个长度至少为 x 的平均值最大的子区间和 b 的一个长度至少为 y 的平均值最大的子区间,就是对分别对 a 和 b 对应的区间求个平均值然后加起来

代码实现

#include<bits/stdc++.h>
using namespace std;
#define MAX 100005
#define ll long long
int n,m,p,q;
double a[MAX],b[MAX],c[MAX],d[MAX],sum[MAX];
double l1,l2,r1,r2;
int check1(double x){
    for(int i=1;i<=n;i++){
        c[i]=a[i]-x;
        sum[i]=sum[i-1]+c[i];
    }
    double y=0x3f3f3f3f;
    for(int i=p;i<=n;i++){
        y=min(y,sum[i-p]);
        if(sum[i]-y>=0) return 1; 
    }
    return 0;
}
int check2(double x){
    for(int i=1;i<=m;i++){
        d[i]=b[i]-x;
        sum[i]=sum[i-1]+d[i];
    }
    double y=0x3f3f3f3f;
    for(int i=q;i<=m;i++){
        y=min(y,sum[i-q]);
        if(sum[i]-y>=0) return 1; 
    }
    return 0;
}
int main(){
    scanf("%lld %lld %lld %lld",&n,&m,&p,&q);
    l1=l2=-1,r1=r2=1e6;
    for (int i=1;i<=n;i++) {
        scanf("%lf",&a[i]);
        l1=min(l1,a[i]);
        r1=max(r1,a[i]);
    }
    for (int i=1;i<=m;i++) {
        scanf("%lf",&b[i]);
        l2=min(l2,b[i]);
        r2=max(r2,b[i]);
    }
    while((r1-l1)>1e-7){
        double mid=(l1+r1)/2.0;
        if (check1(mid)) l1=mid;
        else r1=mid;
    }
    while((r2-l2)>1e-7){
        double mid=(l2+r2)/2.0;
        if (check2(mid)) l2=mid;
        else r2=mid;
    }
    printf("%.10lf\n",l1+l2);//两个数组的最大平均值相加即使区间矩阵的最大平均值 
    return 0;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

区间最大平均值 的相关文章

  • Vue3 setup函数的使用

    全新的 setup 函数 在开始编写 Vue 组件之前 xff0c 需要了解两个全新的前置知识点 xff1a 全新的 setup 函数 xff0c 关系到组件的生命周期和渲染等问题 写 TypeScript 组件离不开的 defineCom
  • Stm32的按键控制流水灯

    对于stm32的设置首先是对时钟进行启动 要求 xff1a key0控制LED0和LED1的亮 key1控制LED0和LED1的亮 kw up控制闪灯 led c span class token macro property span c
  • 头文件之间存在依赖关系该如何包含?

    本文旨在探讨头文件之间存在依赖关系时 xff0c 包含顺序的影响 分两种情况讨论 xff1a 头文件A单方面依赖头文件B xff1a struct h xff1a struct abc int num char ptr def h xff1
  • 单片机入门(利用中断控制流水灯的走向)--适合初学者

    电路图 点击下载 xff08 下载时可能会提醒不安全 xff0c 其实没事 xff0c 本博主是放在自己服务器上面 xff09 代码 span class token macro property span class token dire
  • python实现微信公众号定时消息提醒-手把手教你将代码部署到云端

    这两天微信公众号消息提醒蛮火的 xff0c 我也来蹭一下热度 xff0c 我们的主题是考研倒计时 xff0c 顺便也发一发天气预报 思路 xff1a 获取我们需要的数据 xff0c 比如天气信息 然后去微信公众平台注册一个测试号 xff0c
  • 【章节自测】第三章——顺序程序设计

    第三章 顺序程序设计 学校的老师在上程序设计这门课时 xff0c 给我们每一章指定了一些学习目标 xff0c 用于课前的预习和课后的具体检测复盘 xff0c 因为每一个目标都是具体可测的 xff0c 而只要所有的目标你都能达成 xff0c
  • C语言-进程——信号量

    system V的信号量其实是一个信号量数据 xff0c 一个sysyem V代表的是一个或多个信号量元素 信号量本质上是一个数字 xff0c 用来表征一种资源数量 xff0c 当多个进程或线程争夺这些稀缺资源的时候 xff0c 信号量用来
  • python将包(第三方库)安装到指定目录

    一 在指定目录安装python第三方库 target 61 D software anaconda envs PyTorch Lib 这里的target后面跟的是你python安装环境的lib目录 二 用指定源安装python库 这里用到了
  • Dockerfile详解

    Dockerfile 文章目录 基本结构指令详解FROMRUNLABEL MAINTAINERCOPYADDCMDENTRYPOINTENVARGVOLUMEEXPOSEWORKDIRUSERHEALTHCHECKONBUILD 创建镜像上
  • c++调用yolov4模型进行目标检测-使用opencv4.4.0

    前言 最近刚出的opencv4 4 0也支持了yolov4 xff0c 便尝试用opencv调用yolov4进行检测 xff0c 做个记录 当然 xff0c yolov3 yolov4 tiny等也能调用 xff0c 只需修改加载的cfg和
  • c++调用yolov4模型进行目标检测-使用yolov4官方接口

    前言 yolo系列用c写的 xff0c 在工程中的部署特别方便 4月份yolov4横空出世 xff0c 之前试了试效果 xff0c 精度确实有了很大的提升 xff0c AB大神nb 最近需要在C 43 43 项目中使用yolov4 xff0
  • Ubuntu 20.04安装Anaconda3及简单使用

    1 Anaconda安装包下载 xff08 1 xff09 官网下载 xff0c 下载速度较慢 xff08 2 xff09 清华大学开源软件镜像站 2 安装Anaconda xff08 1 xff09 进入文件下载目录 span class
  • 线性回归推导(二)--求闭式解法及纯python实现

    1 假设函数矩阵表示 定义样本 xff08 m个样本 xff0c 每个样本有n个特征 xff09 X 61
  • VMware 开启笔记本摄像头

    环境 xff1a VMware安装CentOS8 笔记本 xff1a windows11 一 在windows系统中打开服务 xff08 Win 43 R 输入services msc xff09 xff0c 找到VMware USB Ar
  • ROS踩坑 - sudo rosdep init失败

    问题一 问题 xff1a sudo rosdep xff1a 找不到命令 解决方案 这是因为没有安装rosdep xff0c 使用如下命令安装 span class token function sudo span span class t
  • ROS踩坑 - 解决ROS与Ananconda冲突

    一 报错情况 在Anaconda环境下用 catkin make 编译 ROS工作空间 xff0c 出现如下报错 Unable to span class token function find span either executable
  • Logistic回归推导(三)--牛顿法及纯python实现

    1 牛顿法图解 牛顿法一般用来求解方程的根或求解极值 xff0c 其基本思想是 xff1a 在现有极值点估计值附近对f x 做二阶泰勒展开 xff0c 从而找到极值点的下一个估计值 下面用一个例图说明 xff1a 如图横坐标为参数 thet
  • Nginx 配置反向代理不生效(代理到nacos集群)

    环境 xff1a centos8 相信各位安装都不成问题 xff0c 反向代理配置也都能安装网上资料配置完成 xff0c 但问题就出在配置好后启动Nginx xff0c 访问默认端口能成功 xff1a 但是访问自己配置的反向代理就会失败 x
  • 2021-01-31 VGG16

    0 总结 总结 深度很重要 主要contribution在于对网络depth作用的全面evaluation 使用堆叠3x3小卷积 xff0c depth达到16 19 用全卷积之后求和 xff0c 而不是crop xff08 OverFea
  • 兔子繁殖问题Java实现

    span class token comment RubbitNum java span span class token keyword package span span class token namespace cn span cl

随机推荐