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

蓝桥杯真题 - 整数删除 - 题解

题目链接:https://www.lanqiao.cn/problems/3515/learning/

个人评价:难度 2 星(满星:5)
前置知识:STL


整体思路

  • 本题需要做到:快速找到值最小且下标最小的元素,快速删除某个位置的元素;
  • 可以用优先队列 O ( log ⁡ n ) O(\log n) O(logn) 找到最小元素,用并查集或者链表模拟 O ( 1 ) O(1) O(1) 删除操作,优先队列中每个元素维护值、下标、链表迭代器(如果用并查集的话就不需要存迭代器了),再用一个额外数组存更新后的数组值,由于优先队列在数组内元素修改时无法及时更新堆内元素,可以在出队时判断队列中的值是否为最新值(用 vis 数组标记是否被更新过),如果是最新值则更新相邻数字,否则将最新值加入优先队列重新查找最小值。

过题代码

#include <bits/stdc++.h>
using namespace std;

typedef long long LL;
const int maxn = 500000 + 100;
struct Node {
    LL num;
    int idx;
    list<int>::iterator it;

    Node() {}
    Node(LL num, int idx, list<int>::iterator it) : num(num), idx(idx), it(it) {}
};

bool operator<(const Node &a, const Node &b) {
    return a.num == b.num ? a.idx > b.idx : a.num > b.num;
}

int n, k;
LL num[maxn];
bool vis[maxn];
list<int> lst;
list<int>::iterator it;
priority_queue<Node> que;

int main() {
#ifdef ExRoc
    freopen("test.txt", "r", stdin);
#endif // ExRoc
    ios::sync_with_stdio(false);

    cin >> n >> k;
    for (int i = 1; i <= n; ++i) {
        cin >> num[i];
        lst.push_back(i);
        it = lst.end();
        --it;
        que.push(Node(num[i], i, it));
    }
    while (k > 0) {
        Node node = que.top();
        que.pop();
        if (vis[node.idx]) {
            vis[node.idx] = false;
            node.num = num[node.idx];
            que.push(node);
            continue;
        }

        --k;
        if (node.it != lst.begin()) {
            it = node.it;
            --it;
            num[*it] += num[node.idx];
            vis[*it] = true;
        }

        it = node.it;
        ++it;
        if (it != lst.end()) {
            num[*it] += num[node.idx];
            vis[*it] = true;
        }
        lst.erase(node.it);
    }
    for (int idx : lst) {
        cout << num[idx] << " ";
    }
    cout << endl;

    return 0;
}

http://www.kler.cn/a/532107.html

相关文章:

  • 机器学习--1.KNN机器学习入门
  • 5.角色基础移动
  • [mmdetection]fast-rcnn模型训练自己的数据集的详细教程
  • 【HTML入门】Sublime Text 4与 Phpstorm
  • 机器学习10
  • 四川正熠法律咨询有限公司正规吗可信吗?
  • 《深入实现事件发布-订阅模式:从基础到优化》
  • 【番外】lombok在IDEA下失效的解决方案
  • DeepSeek本地部署的一些问题记录
  • Linux:基础IO(二.缓冲区、模拟一下缓冲区、详细讲解文件系统)
  • 浏览器查询所有的存储信息,以及清除的语法
  • 20250204在Ubuntu22.04下配置荣品的RK3566开发板的Android13的编译环境
  • 网站快速收录:如何优化网站本地搜索排名?
  • 昆明理工大学2025通信复试真题及答案-通信核心课程综合
  • ORB-SLAM2源码学习:KeyFrame.cc③: void KeyFrame::AddConnection更新连接权重
  • 字节序与Socket编程
  • 想品客老师的第十一天:模块化开发
  • Java线程创建与管理:继承、实现、Callable与线程池
  • 【Java知识】使用Java实现地址逆向解析到区划信息
  • sql字符串函数及字符拼接函数
  • kubernetes 核心技术-集群安全机制 RBAC
  • 流式学习(简易版)
  • 刷题笔记 哈希表-1 哈希表理论基础
  • AI 编程工具—Cursor进阶使用 Agent模式
  • 【棋弈云端】网页五子棋项目测试报告
  • 趣味Python100例初学者练习01