蓝桥杯23年第十四届省赛-整数删除|STL优先队列、双向链表

题目链接:

蓝桥杯2023年第十四届省赛真题-整数删除 - C语言网 (dotcpp.com)

 0整数删除 - 蓝桥云课 (lanqiao.cn)

学习:蓝桥杯真题讲解:整数删除_蓝桥杯整数删除 c语言-CSDN博客 

说明:

在暴力做法里面,每次都要花费O(n)时间找最小值,再花O(n)时间找相邻的未被删除的元素。外层是k次删除。k*n的复杂度会超时。

于是考虑优化:每次只需要找最小值,不用完全排序,完全排序会把所有的大小顺序找出来,而我们不关注,因为会有相邻元素加上这个被删除的元素,原来的完全排序失去了参考意义,况且完全排序O(NlogN) 。所以选择堆排序,也就是优先队列,greater表示小顶堆,logn的复杂度。使用结构体第三个参数要自己实现仿函数。

类似:

struct cmp{bool operator() ( Node a, Node b ){if( a.x== b.x ) return a.y> b.y;         return a.x> b.x; }
}

 参考学习:优先队列详解/C++-CSDN博客

排序时,值相同时,要比较索引,索引小的先删,所以队列的元素肯定要包括值和索引。并且,如果没有索引,就没办法知道它对应的位置是哪个,没办法找相邻的元素。故确定了优先队列的一个元素需要保存哪些信息。两个元素可以使用pair,保存值和它的位置索引。pair类型元素排序时先比较第一个元素,相同则比较第二个元素,符合题意,删除索引更小的最小元素。

要快速找出未被删除的相邻的元素,就要维护每个元素的相邻元素的坐标(前驱,后继)数组,逻辑上相当于一个双向链表 。每次删除元素时要做相应的更新。这样找 被删除的元素 的 未被删除的相邻的元素 的时间就降低到O(1)。

因为删除元素后,相邻元素更新后的值已经保存在数组st里。如果这个元素在队列里不会被排到队头,也就是不更新的值也不是最小的,不会影响优先队列取最小值,那么就不用再更新队列里的这个元素的值。所以一个if语句是否队头元素值等于它在数组的值判断就够了,确定是不是我没更新的那个元素排到队头来,如果是,需要更新值,再入队,重新调整堆,再取队头,确保取出最新的最小值。

小结


1.当只需要最值时,考虑用堆排序(优先队列)

2.相邻元素会变化时,需要快速找到相邻元素时,为每个元素 维护相邻下标,变化就更新。

代码部分

暴力代码:


#include<bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
typedef pair<int,int> pii;
const int N =5e5+10;
int ans = 0;
int k;
int a[N];//原始数组,存原始数据 
int mn=1e8+1;
int mnj=-1;signed main() {ios::sync_with_stdio(0); cin.tie(0);cout.tie(0);int n;cin>>n;cin>>k;for(int i=0;i<n;i++){cin>>a[i];st[i]=a[i];pq.push({a[i],i});l[i]=i-1;r[i]=i+1;if(i==n-1)r[i]=-1; }for(int i=1;i<=k;i++){mn=1e8+1;for(int j=0;j<n;j++){if(mn>a[j]&&a[j]!=-1){mn=a[j];mnj=j;}}//暴力时需要注意的,//找相邻的元素时可能相邻的元素不止一个被删除了,要用while一直找到一个未被删除的 int lj=mnj;while(lj-1>=0&&a[lj-1]==-1){lj--;}if(lj-1>=0&&a[lj-1]!=-1) a[lj-1]+=a[mnj];int rj=mnj;while(rj+1<n&&a[rj+1]==-1){rj++;}if(mnj+1<n&&a[rj+1]!=-1){a[rj+1]+=a[mnj];}a[mnj]=-1;}for(int i=0;i<n;i++){if(a[i]!=-1)cout<<a[i]<<' ';}return 0;
}

正解代码:

#include<bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
typedef pair<int,int> pii;
const int N =5e5+10;
int ans = 0;
int k;
int a[N];//原始数组,存原始数据 
int mn=1e8+1;
int mnj=-1;priority_queue<pii,vector<pii>,greater<pii>> pq; 
//链表的存储,用每个元素的前驱,后继来表示 
int l[N],r[N];//第i个元素的前驱,后继(左相邻,右相邻) int st[N];//标记是否被删除 .也可以用来临时存储  变化后的值 
signed main() {ios::sync_with_stdio(0); cin.tie(0);cout.tie(0);int n;cin>>n;cin>>k;for(int i=0;i<n;i++){//    cin>>a[i];//    st[i]=a[i];//pq.push({a[i],i});cin>>st[i];pq.push({st[i],i});l[i]=i-1;r[i]=i+1;if(i==n-1)r[i]=-1; }while(k){pii t=pq.top();pq.pop();//该元素相邻元素被删除后没更新,更新后再加入队列重新排序, 这次循环因为没有找到实际的最小元素,没有删除,跳过本次循环 if(t.first!=st[t.second]){// a[t.second]=st[t.second]; pq.push({st[t.second],t.second});continue;}//只有删除了元素,k才减 k--;int pos=t.second;//删除元素后要更新 相邻元素的 前驱后继,注意这里中括号里不能写pos-1,pos+1//有可能此时它的前驱后继已经不是原始的相邻元素了 //注意要判断它的前驱后继是否越界 if(r[pos]>=0)l[r[pos]]=l[pos];if(l[pos]>=0)r[l[pos]]=r[pos]; if(l[pos]>=0)st[l[pos]] +=t.first;if(r[pos]>=0)st[r[pos]] +=t.first;//更新后或者没被更新过的 最小的数 删除 ,标记,打印时不再打印 st[pos]=-1;}//如果最后用a数组来输出,还要排空队列,因为可能还存在没及时更新的元素,没更新之前他也足够大所以一直没被排到队头
//所以没被更新 //  while(!pq.empty()){//          pii t=pq.top();//       pq.pop();//       if(t.first!=st[t.second]){//           a[t.second]=st[t.second]; //     }//  }for(int i=0;i<n;i++){if(st[i]!=-1)cout<<st[i]<<' ';}return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于神经网络的人脸识别系统的设计与实现

基于神经网络的人脸识别系统的设计与实现 摘要&#xff1a; 随着计算技术的快速发展&#xff0c;人脸识别已成为身份验证、安全监控等领域的关键技术。本文旨在设计并实现一个基于神经网络的人脸识别系统&#xff0c;该系统能够自动地从输入图像中检测和识别出人脸。论文首先介…

GPT-4智能体:迈向GPT-5的跳板

来自&#xff1a;鸵傲科技开发 在当今这个信息爆炸的时代&#xff0c;人工智能&#xff08;AI&#xff09;技术正以前所未有的速度发展&#xff0c;其中自然语言处理&#xff08;NLP&#xff09;领域尤为引人注目。GPT系列模型&#xff0c;作为NLP领域的佼佼者&#xff0c;其每…

php编辑器 ide 主流编辑器的优缺点。phpstorm vscode atom 三者对比

编辑器PhpStormvscodeAtom是否收费收费&#xff0c;有30天试用期免费免费内存占用Java平台&#xff0c;一个进程1G多内存占用好几个进程&#xff0c;合起来1G上下/基本功能都具备&#xff0c;有的功能需要装插件都具备&#xff0c;有的功能需要装插件都具备&#xff0c;有的功能…

机器学习之分层聚类中的概念聚类(Conceptual Clustering)

概念 在分层聚类中,概念聚类指的是通过将数据点分组成具有相似性的概念或类别,并构建一个层次化的结构来表示这些概念之间的关系。这种方法旨在捕捉数据的内在结构,并将数据组织成一个层次化的树状结构,以便更好地理解数据的层次性和相关性。 概念聚类在分层聚类中的主要…

《基础设施即代码(IaC)》译者序

随着信息技术的飞速发展&#xff0c;我们对基础设施的理解也在不断深化。传统的基础设施往往被看作是硬件和软件的堆砌&#xff0c;而现在&#xff0c;基础设施的概念已经发生了巨大的变化。在当今这个信息化、数字化的时代&#xff0c;基础设施已经成为了企业和组织运行的核心…

使用CMake搭建简单的Qt程序

目录结构 代码 CMakeLists.txt&#xff1a; cmake_minimum_required(VERSION 3.15)set(CMAKE_AUTOUIC ON) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTORCC ON)# set the project name project(xxx)# 设置Qt的路径 # 例如 E:/Qt/Qt/aaa/msvc2019_64 # aaa 为Qt的版本号 set(QT_PATH…

2024年MathorCup数学建模思路B题思路分享

文章目录 1 赛题思路2 比赛日期和时间3 组织机构4 建模常见问题类型4.1 分类问题4.2 优化问题4.3 预测问题4.4 评价问题 5 建模资料 1 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 2 比赛日期和时间 报名截止时间&#xff1a;2024…

应用案例分享|3D视觉引导汽车铅蓄电池自动化拆垛

在汽车制造及相关配套产业链中&#xff0c;铅蓄电池作为关键零部件之一&#xff0c;其生产和处理环节对效率和精准度都有着极高的要求。传统的铅蓄电池拆垛作业往往依赖于人工操作&#xff0c;不仅效率低下&#xff0c;还存在安全隐患。 项目背景 某大型蓄电池企业&#xff0c…

基于Spring Boot的校园招聘平台设计与实现(附源码+数据库+万字文档+PPT)

基于Spring Boot的校园招聘平台 一、摘要 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 毕业生信息招聘平台&#xff0c;主要的模块包括查看管理员&#xff1b;首页、个人中心、企业管理、空中宣…

瑞_23种设计模式_迭代器模式

文章目录 1 迭代器模式&#xff08;Iterator Pattern&#xff09;★★★1.1 介绍1.2 概述1.3 迭代器模式的结构1.4 中介者模式的优缺点1.5 中介者模式的使用场景 2 案例一2.1 需求2.2 代码实现 3 案例二3.1 需求3.2 代码实现 4 JDK源码解析 &#x1f64a; 前言&#xff1a;本文…

【论文笔记】Text2QR

论文&#xff1a;Text2QR: Harmonizing Aesthetic Customization and Scanning Robustness for Text-Guided QR Code Generation Abstract 二维码通常包含很多信息但看起来并不美观。stable diffusion的出现让平衡扫描鲁棒性和美观变为可能。 为了保证美观二维码的稳定生成&a…

python环境依赖安装指北——报错记录(持续更新中~)

生成requirements.txt文件 参考链接&#xff1a;https://zhuanlan.zhihu.com/p/687462277 省流&#xff1a;推荐使用pipreqs库&#xff0c;可以只导出项目用到的库 pip install pipreqspipreqs ./ --encodingutf8 --forcepip install -r requirements.txt 各种错误合集 err…

6款Mac垃圾清理软件横评 Mac电脑清理软件哪个好 cleanmymac评测

鉴于苹果笔记本昂贵的硬盘价格&#xff0c;导致我们不得不定期清理自己的硬盘空间&#xff0c;释放给真正有用的各种程序等。 即便我们把程序安装到外置硬盘&#xff0c;但是程序运行时的缓存&#xff0c;仍然是在内置的硬盘中。 今天就让我们对比看看&#xff0c;目前市面上…

Hystrix、Resilience4j和Sentinel对比

常用组件库对比 Hystrix、Resilience4j和Sentinel Hystrix、Resilience4j和Sentinel都是服务容错库&#xff0c;用于在分布式系统中实现诸如隔离、限流和熔断等模式。它们各有特点&#xff0c;在实现这些模式时也有所不同。下面是这三个库在隔离、限流和熔断方面的对比&#x…

从 Redis 开源协议变更到 ES 国产化:一次技术自主的机遇

引言 近日&#xff0c;Redis Labs 宣布其主导的开源项目 Redis 将采用双重源代码可用许可证&#xff08;RSALv2&#xff09;和服务器端公共许可证&#xff08;SSPLv1&#xff09;。这一重大决策标志着 Redis 从传统的 BSD 许可证向更加严格的控制权转变&#xff0c;同时也引发…

物流管理系统|基于Springboot的物流管理系统设计与实现(源码+数据库+文档)

物流管理系统目录 目录 基于Springboot的物流管理系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、管理员和管理员功能实现 &#xff08;1&#xff09;用户管理 &#xff08;2&#xff09;公告信息管理 &#xff08;3&#xff09;物流信息管理 &#xff08;…

智慧安防监控EasyCVR视频调阅和设备录像回看无法自动播放的原因排查与解决

智慧安防监控EasyCVR视频管理平台能在复杂的网络环境中&#xff0c;将前端设备统一集中接入与汇聚管理。国标GB28181协议视频监控/视频汇聚EasyCVR平台可以提供实时远程视频监控、视频录像、录像回放与存储、告警、语音对讲、云台控制、平台级联、磁盘阵列存储、视频集中存储、…

Linux查询mac物理地址

方法一&#xff1a;通过/sys文件系统 /sys文件系统提供了一种访问和控制硬件设备的方法。 可以在/sys/class/net/目录下找到每个网络接口的详细信息。 cat /sys/class/net/eth0/address 将eth0替换为您想要查询的网络接口名称。这将输出该接口的MAC地址。 方法二&#xff1a;…

【面试八股总结】超文本传输协议HTTP(一)

一、 什么是HTTP协议&#xff1f; HTTP是超文本传输协议 HyperText Transfer Protocol 特性&#xff1a; 简单、灵活、易于扩展无状态&#xff1a;服务器不会记忆HTTP状态不安全&#xff1a;通信使用明文&#xff0c;不验证通信方身份&#xff0c;无法的证明报文的完整性&…

生命周期钩子

在Vue中&#xff0c;生命周期钩子是指在Vue实例创建到销毁的过程中&#xff0c;Vue自动调用的函数。这些钩子函数为开发者提供了在Vue实例的不同阶段执行自定义逻辑的机会。以下是一些主要的生命周期钩子及其用途的示例&#xff1a; beforeCreate&#xff08;创建前&#xff09…