当前位置: 首页 > news >正文

【蓝桥杯】2023省赛H题

考察知识点:双向链表,小根堆                                                                                                       完整代码在文章末尾

题目

【问题描述】

        给定一个长度为 N 的整数数列: A1,A2,...,AN。你要重复以下操作 K 次 : 每次选择数列中最小的整数(如果最小值不止一个,选择最靠前的),将其删除。并把与它相邻的整数加上被删除的数值。
        输出 K 次操作后的序列。

【输入格式】

        第一行包括两个整数 N 和 K 。

        第二行包含 N 个整数,A1,A2,A3......,AN。

【输出格式】

        输出N - K 个整数,中间是用一个空格隔开,代表K次操作后的序列。

思路

根据题意可知,这个序列需要大量的删除,我们可以使用链表来实现。

1、定义一个结构体,同时声明一个结构体数组

a72db052730a42b5a53a70997b19a8ea.png

        其中data代表这个结构体储存的数据,before代表前驱节点,after代表后继节点,stu代表这个节点是否存在(stu = 1表示未被删除,stu = 0表示已经被删除)。

2、 建一个堆

55c4f28a347f4d28930250f01f7064a8.png

 c29b44aff5b549969dd7b9f7b00a2ded.png

        我们将节点的值与节点的索引放入堆中,使用时将节点值最小的节点弹出。(需要判定一下这个节点的值是否已经改变,如果已经改变则不能使用此节点)。

3、输入数据

d24d6f5b465d435cb76dc53a67eb83b5.png

        将数据输入,一个节点 i 初始时前驱索引为 i - 1,后继节点索引为 i + 1,状态初始化为1。同时将这个节点放入小根堆中。

4、进行整数删除操作

dbb42d8af82c413280c7a8e8f30845ab.png

        为方便操作使用 add 代表删除节点的索引,bef代表删除节点前驱的索引,aft代表删除节点后继的索引。

33647aad9dd54d9ca8fc17a624ae2df2.png

db32291434f0408ba062222d29a86242.png

        如果前驱节点不为0,则对前驱节点进行更新,将更新后的节点值与索引放入堆中。如果后继节点为≤n,则对后继节点进行更新,将更新后的节点值与索引放入堆中。

f29f825d0fa44dcba3e754bc1591b10f.png

        add节点已经被删除,将其状态值更新为0,表示该节点已经被删除。接着进行下次循环,直到删除k个节点为止。 

5、输出元素

f654dcbe48994dd682321be3d948e893.png

        这是最后一步 ,输出元素时要先根据stu值判断该节点是否存在,如果存在则输出,否则不输出。

代码

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 500010;
typedef pair<int,int> PII;
int n,k;
struct L{int data,before,after,stu;
}l[N];int32_t main()
{cin >> n >> k;priority_queue<PII,vector<PII>,greater<PII>> heap;for(int i = 1; i <= n; i ++){cin >> l[i].data;l[i].after = i + 1;l[i].before = i - 1;l[i].stu = 1;PII s = {l[i].data,i};heap.push(s);}while(k --){bool flag = true;PII t;while(flag){t = heap.top();heap.pop();if(l[t.second].data == t.first) flag = false;}int add = t.second;int bef = l[add].before;int aft = l[add].after;if(bef != 0){l[bef].data += l[add].data;l[bef].after = l[add].after;PII s1 = {l[bef].data,bef};heap.push(s1);}if(aft <= n){l[aft].data += l[add].data;l[aft].before = l[add].before;PII s2 = {l[aft].data,aft};heap.push(s2);}l[add].stu = 0;}for(int i = 1; i <= n; i ++){if(l[i].stu == 1)cout << l[i].data << " ";}return 0;
}

相关文章:

  • springboot前后端时间类型传输
  • Ansible的role
  • 0基础学习PyFlink——使用datagen生成流式数据
  • 【架构图解】API架构图解:如何以图表形式展现复杂系统
  • XPATH 注入漏洞
  • 数据可视化:动态柱状图
  • 关于SNAP的Biophysical Processor模块的计算准确率以及大厂10月种植情况
  • 网络安全进阶学习第二十一课——XXE
  • Docker数据卷使用过程中想到的几个问题
  • linux下使用vscode对C++项目进行编译
  • vue的rules验证失效,部分可以部分又失效的原因
  • Linux之管道
  • 下载安装各种版本的Vscode以及解决VScode官网下载慢的问题
  • MySQL 为什么在 8.0 版本中移除了查询缓存功能?
  • 【AI视野·今日Robot 机器人论文速览 第六十一期】Tue, 24 Oct 2023
  • 【跃迁之路】【641天】程序员高效学习方法论探索系列(实验阶段398-2018.11.14)...
  • 2017-08-04 前端日报
  • ECMAScript 6 学习之路 ( 四 ) String 字符串扩展
  • HashMap剖析之内部结构
  • JS专题之继承
  • MYSQL如何对数据进行自动化升级--以如果某数据表存在并且某字段不存在时则执行更新操作为例...
  • React 快速上手 - 07 前端路由 react-router
  • SpiderData 2019年2月23日 DApp数据排行榜
  • Web标准制定过程
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • 给初学者:JavaScript 中数组操作注意点
  • 更好理解的面向对象的Javascript 1 —— 动态类型和多态
  • 工作手记之html2canvas使用概述
  • 力扣(LeetCode)22
  • 聊聊springcloud的EurekaClientAutoConfiguration
  • 面试题:给你个id,去拿到name,多叉树遍历
  • 你真的知道 == 和 equals 的区别吗?
  • 前端技术周刊 2019-01-14:客户端存储
  • 十年未变!安全,谁之责?(下)
  • 小程序 setData 学问多
  • Java数据解析之JSON
  • 阿里云ACE认证之理解CDN技术
  • ​LeetCode解法汇总518. 零钱兑换 II
  • #etcd#安装时出错
  • (2)关于RabbitMq 的 Topic Exchange 主题交换机
  • (8)STL算法之替换
  • (规划)24届春招和25届暑假实习路线准备规划
  • (力扣记录)235. 二叉搜索树的最近公共祖先
  • (十一)JAVA springboot ssm b2b2c多用户商城系统源码:服务网关Zuul高级篇
  • (状压dp)uva 10817 Headmaster's Headache
  • .babyk勒索病毒解析:恶意更新如何威胁您的数据安全
  • .bat批处理(三):变量声明、设置、拼接、截取
  • .NET Compact Framework 多线程环境下的UI异步刷新
  • .NET 使用 ILMerge 合并多个程序集,避免引入额外的依赖
  • .NET中的Event与Delegates,从Publisher到Subscriber的衔接!
  • @ConditionalOnProperty注解使用说明
  • @vue/cli 3.x+引入jQuery
  • [] 与 [[]], -gt 与 > 的比较
  • [AIGC] Spring Interceptor 拦截器详解
  • [ajaxupload] - 上传文件同时附件参数值