2024牛客五一集训派对day2 Groundhog Looking Dowdy 个人解题思路

前言:

  被实验室教练要求要打的这次五一牛客的训练赛,这些区域赛难度的题对于大一的我来说难度实在是太高了,我和我的队友只写了一些非常简单的签到题,其他题目都没怎么看(我们太弱了),但我可以分享一下我能做出来的题的思路。

正文:

题目:

链接:F-Groundhog Looking Dowdy_2024牛客五一集训派对day2 (nowcoder.com)

题意:

  告诉你有n天,每天都有j个数字,让你每天选出当天(第i天)的其中1个,让你求出n天中m天(m<=n)选出的数字的最小的数字最大值与最小值的差值。

  比如样例,共4天,我们需要选3天,最小的差值当且仅当选1,3,4天时,这时这3天中最大的是3,最小的是1,差值为2。2为最小差值,所以输出2。

思路:

    一:

  我们不妨定义一个结构体,包含一个数字和它所在的天数。将这些结构体按数字大小排序,这样我们就得到了一串递增或递减的数组,我们要求出的答案一定是这个数组的一段连续的子数组(数组中连续的一小段)的左右两端的差值的绝对值(表示最大值与最小值的差值),同时我们要让这段子数组合理(数组中数字代表的不同天数的个数为m),如此我们就能得到答案。

  首先我先考虑了暴力的算法,通过两层循环,第一层找开始的第一个数字,第二层遍历到满足子数组条件的第一个的数字上,两个数字相减就是答案。这个思路显然是没问题的,但是明显两层循环处理1e6的数据量会超时,我们得想办法优化掉暴力的算法。

   二:

  我们可以发现通过循环遍历找这段数组十分耗时,我们没必要一遍又一遍的从第一层循环的数字开始找,我们可以设计两个指针,一个指向第一个数字,一个指向后面的一个数字,当这段数字满足条件时就记录下这个数字并移动左指针,若不满足则考虑移动右指针,这样的方式叫滑动窗口(不懂的可以看看这篇博客 滑动窗口详解_窗口滑动-CSDN博客)。我们可以通过桶排的方式来记录天数数量,每次移动指针时再判断天数数量是否等于m,在所有符合答案的数字中找最小值输出即可。代码如下。

#include <bits/stdc++.h>
using namespace std;
const int N=2e6+5;
typedef struct node{
    int a;
    int day;
}node;
node b[N];
int book[N];
bool cmp(node x,node y){
    return x.a<y.a;
}
int n,m,ans=1000000000;
int main(){
    cin>>n>>m;
    int cnt=1;
    for(int i=1;i<=n;i++){
        int x;cin>>x;
        for(int j=1;j<=x;j++){
            cin>>b[cnt].a;
            b[cnt].day=i;
            cnt++;
        }
    }
    cnt--;
    sort(b+1,b+cnt+1,cmp);
    for(int i=1,j=m;i<=cnt&&j<=cnt&&i<j;){
        int diff=0;memset(book,0,sizeof(book));
        for(int k=i;k<=j;k++){
            if(!book[b[k].day]){
                diff++;
                book[b[k].day]++;
            }
        }
        if(diff==m){
        //  cout<<b[j].a<<" "<<b[i].a<<endl;
            ans=min(ans,b[j].a-b[i].a);
            j++;
        }
        if(diff>m)i++;
        if(diff<m)j++;
    //  cout<<i<<" "<<j<<" "<<diff<<" "<<endl;
    }
    cout<<ans<<endl;
}

三:

但是这段代码依旧超时了,主要是每次记录天数数量都要从子数组的开始到结束,极大增加了不必要的运算。对于diff,我们可以根据指针的改变来动态维护,这样就避免了不必要的运算,最后结果终于ac了(943ms,比较极限),代码如下:

#include <bits/stdc++.h>
using namespace std;
const int N=2e6+5;
typedef struct node{
	int a;
	int day;
}node;
node b[N];
int book[N];
bool cmp(node x,node y){
	return x.a<y.a;
}
int n,m,ans=1000000000;
int main(){
	cin>>n>>m;
	int cnt=1;
	int diff=0;
	for(int i=1;i<=n;i++){
		int x;cin>>x;
		for(int j=1;j<=x;j++){
			cin>>b[cnt].a;
			b[cnt].day=i;
			cnt++;
		}
	}
	cnt--;
	sort(b+1,b+cnt+1,cmp);
	for(int i=1;i<=m;i++){
		if(!book[b[i].day]){
			diff++;
			book[b[i].day]++;
		}
	}
	int l=1,r=m;
	while(diff<m){
		r++;
		if(!book[b[r].day]){
			diff++;
			book[b[r].day]++;
		}
	}
	while(r<=cnt){
	//	cout<<b[r].a<<" "<<b[l].a<<endl;
		ans=min(ans,b[r].a-b[l].a);
		book[b[l].day]--;
		l++;
		if(book[b[l-1].day]==0) diff--;
		while(diff<m&&r<=cnt){
			r++;
			if(!book[b[r].day]){
				diff++;
				book[b[r].day]++;
			}
			
		}
	}
	cout<<ans<<endl;
}

后记:

  这是我第一次详细的写自己的解题思路,文章难免有点生疏,希望读者见谅。同时也欢迎各位来提出建议和讨论。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/608348.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Powerdesigner导入mysql8之后注释丢失

目录 一、问题描述及解决思路 二、导入的步骤 1.先按正常步骤建立一个物理数据模型 &#xff08;1&#xff09;点击“文件-新建模型” &#xff08;2&#xff09;选择物理模型和数据库 2.从sql文件导入表 &#xff08;1&#xff09;点击“数据库-Update Model from Data…

智慧营销的未来:中国AIGC技术的演进与应用 #未来是现在的趋势#

&#x1f4d1;前言 随着人工智能&#xff08;AI&#xff09;技术的蓬勃发展&#xff0c;尤其是在营销技术&#xff08;MarTech&#xff09;领域&#xff0c;AIGC&#xff08;AI Generated Content&#xff09;技术在中国市场的应用和影响日益显著。2023年&#xff0c;中国在AIG…

16-LINUX--线程安全

一。线程安全 线程安全即就是在多线程运行的时候&#xff0c;不论线程的调度顺序怎样&#xff0c;最终的结果都是 一样的、正确的。那么就说这些线程是安全的。 要保证线程安全需要做到&#xff1a; 1&#xff09; 对线程同步&#xff0c;保证同一时刻只有一个线程访问临界资…

什么是静态住宅代理IP?

静态住宅代理&#xff08;也称为静态ISP代理&#xff09;是最流行的代理类型之一。它们也是隐藏您的身份并保持在线匿名的最佳方法之一。您为什么要使用住宅代理而不是仅使用常规代理服务&#xff1f;下面我具体分享。 一、什么是静态住宅代理&#xff1f; 首先&#xff0c;我…

vivado 低级别 SVF JTAG 命令

低级别 SVF JTAG 命令 注释 &#xff1a; 在 Versal ™ 器件上不支持 SVF 。 低级别 JTAG 命令允许您扫描多个 FPGA JTAG 链。针对链操作所生成的 SVF 命令使用这些低级别命令来访问链中的 FPGA 。 报头数据寄存器 (HDR) 和报头指令寄存器 (HIR) 语法 HDR length […

怎么制作地理思维导图?方法推荐

怎么制作地理思维导图&#xff1f;随着信息技术的飞速发展&#xff0c;教育领域也迎来了深刻的变革。思维导图作为一种高效的学习工具&#xff0c;已经广泛应用于地理学科的教学中。它不仅可以帮助学生更好地理解和记忆地理知识&#xff0c;还能提高学习效率。本文将为大家推荐…

ESP-WROOM-32配置Arduino IDE开发环境

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、下载Arduino IDE二、安装工具集三、测试样例1.选则开发板2.连接开发板3.示例程序 四、使用官方示例程序总结 前言 之前用了很多注入STM32、树莓派Pico和Ar…

超标量处理器设计:重排序缓存(ROB)

★超标量处理器的很多地方用到了重排序缓存&#xff0c;但是我对它不是很了解&#xff0c;所以我整理一下重排序缓存的知识点。 重排序缓存(ROB)在确保乱序执行的指令能够正确地完成和提交(Commit)&#xff0c;也可以用来寄存器重命名。 ROB是一个先进先出的表&#xff0c;每个…

车载测试___长安汽车车机测试项目

项目介绍: 长安汽车车机是以腾讯车载互联为基础&#xff0c;融合了多媒体影音系统(QQ音乐、喜马拉雅FM、酷我音乐)、车载导航、车辆功能设定这些选项&#xff0c;可以在线听歌、导航、查看360度全景影像辅助系统&#xff0c;让车主驾车更加安逸享受。 具体模块包含远程车辆状…

LeetCode 147. 对链表进行插入排序

目录 1.原题链接&#xff1a; 2.从前往后插入结点&#xff1a; 代码实现&#xff1a; 3.提交结果&#xff1a; 4.读书分享&#xff1a; 1.原题链接&#xff1a; 147. 对链表进行插入排序 2.从前往后插入结点&#xff1a; 对于本题&#xff0c;我们可以以头结点作为参考…

【Leetcode】八大排序

总述 插入排序&#xff1a;直接插入排序&#xff1b;希尔排序&#xff1b; 选择排序&#xff1a;简单选择排序&#xff1b;堆排序&#xff1b; 交换排序&#xff1a;冒泡排序&#xff1b;快速排序&#xff1b; 归并排序&#xff1b; 桶排序/基数排序&#xff1b; 直接插入排序 …

NVIDIA Omniverse Cloud API支持数字孪生开发,可解决复杂AI问题 | 最新快讯

在全球范围内&#xff0c;价值超过 50 万亿美元的重工业市场&#xff0c;正在竞相实现数字化。 基于此&#xff0c;为帮助数字孪生技术更好地赋能千行百业&#xff0c;AI 企业 NVIDIA 在架构底层算力的同时&#xff0c;也搭建了 NVIDIA AI Enterprise 和 Omniverse 两大平台。 …

【隧道篇 / WAN优化】(7.4) ❀ 03. WAN优化的原理 ❀ FortiGate 防火墙

【简介】相信对WAN优化感兴趣的人都会有疑问&#xff0c;WAN优化真的有作用吗&#xff1f;如果真的有作用&#xff0c;那是根据什么原理呢&#xff1f;让我们来更深入的了解一下。 客户端和服务器端 其实很多人在一开始看到WAN优化这个词&#xff0c;就自然的以为上网速度太慢&…

基于51单片机的智能垃圾桶仿真设计( proteus仿真+程序+设计报告+原理图+讲解视频)

这里写目录标题 1. 主要功能&#xff1a;2. 讲解视频&#xff1a;3. 仿真4. 程序代码5. 设计报告6. 原理图7. 设计资料内容清单资料下载链接&#xff1a; 基于51单片机智能垃圾桶仿真设计( proteus仿真程序设计报告原理图讲解视频&#xff09; 仿真图proteus8.9及以上 程序编译…

ABB RobotStudio学习记录(一)新建工作站

RobotStudio新建工作站 最近遇到 虚拟示教器和 Rapid 代码不能控制 视图中机械臂的问题&#xff0c;其实是由于机械臂和工作站不匹配。以下是解决方法。 名称版本Robot Studio6.08 新建一个”空工作站“&#xff1b; 在目标位置新建一个目标文件夹 C:\solution\test&#xff0…

鸿蒙内核源码分析(文件概念篇) | 为什么说一切皆是文件

什么是文件 不说清楚什么是文件就说不清楚文件系统,更说不清楚内核是如何管理和为什么要这么来管理文件的。现代操作系统为解决信息能独立于进程之外被长期存储引入了文件,将文件抽象成一个宽泛的概念,把文档、目录&#xff08;文件夹&#xff09;、键盘、监视器、硬盘、可移动…

视频监控平台:交通运输标准JTT808设备SDK接入源代码函数分享

目录 一、JT/T 808标准简介 &#xff08;一&#xff09;概述 &#xff08;二&#xff09;协议特点 1、通信方式 2、鉴权机制 3、消息分类 &#xff08;三&#xff09;协议主要内容 1、位置信息 2、报警信息 3、车辆控制 4、数据转发 二、代码和解释 &#xff08;一…

C语言leetcode刷题笔记1

C语言leetcode刷题笔记1 第1题&#xff1a;136.只出现一次的数字两次遍历&#xff08;O(numsSize^2)&#xff09;位运算 第2题&#xff1a;202.快乐数快慢指针记录历史数据 第3题&#xff1a;53.最大子数组和暴力求解&#xff08;超时&#xff09;动态规划分治 第1题&#xff1…

机器学习初学者 6 个核心算法!建议收藏,反复观看!

今天再来介绍机器学习算法的基本概念和适用场景&#xff01; 首先&#xff0c;引用一句英国统计学家George E. P. Box的名言&#xff1a;All models are wrong, but some are useful. 没有哪一种算法能够适用所有情况&#xff0c;只有针对某一种问题更有用的算法。 也就是说&…

【新版系统架构】知识点背诵默写本

前言 系统架构考试在即&#xff0c;想要考试的人肯定感受到了沉甸甸的压力和紧迫感&#xff0c;脑海中不断闪过知识点的画面&#xff0c;却让人有些头昏脑胀&#xff0c;发现很难完全记住&#xff0c;这个考试很难&#xff0c;知识点很多。这次我在准备考试的同时&#xff0c;…