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

蓝桥杯整数删除(优先队列pair,模拟链表)

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

第一行包含两个整数 N 和 K。
第二行包含 N 个整数,A1, A2, ... , AN。
对于 20% 的数据,1 ≤ K < N ≤ 10000。
对于 100% 的数据,1 ≤ K < N ≤ 5 × 1e5,0 ≤ Ai ≤ 1e8。

输入

5 3
1 4 2 8 7

输出 

17 7

暴力:for循环找最小值,o(n**2)超了,用vector删除优点是不需要模拟链表的删除过程,不需要实时记录被删除的数的索引,(注意min值是要在每个K循环之前都要更新的,呜呜,一开始我在循环外更新,就出错了,找了好久才发现错因)

#include<bits/stdc++.h>
using namespace std;
#define N 0x3f3f3f3f
#define int long long
int n,k;
vector<int> v(5e5);
signed main()
{
	cin>>n;
	cin>>k;
	for(int i=0;i<n;i++)
	{
		cin>>v[i];
	}
	int e=n;
	int x=0;
	while (k--)
	{
        int min=N;
		for(int i=0;i<e;i++)
		{
			if(min>v[i]) 
			{
				min=v[i];
			    x=i;
			}
		}
	    v[x-1]+=v[x];
		v[x+1]+=v[x];
		v.erase(v.begin()+x);
		e--;
	} 
	for(int i=0;i<e;i++)
	{
		cout<<v[i]<<" ";
	}
	cout<<endl;
	return 0;
}

优化: 模拟链表(便于删除中间节点):需要左右两个指针链接各个节点

优先队列:便于找到最值并且出队,相当于逻辑上删除该数下次不再比较这个数,但是缺点是不能实时更新//由于每删除一个数,其两边相邻数都要+1,因此,priority_queue里的数不一定是实时的,所以需要引入st[]存储更新,且在每次输出最小值时都要比较一下 

#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> pii;
const int N = 5e5 + 10;
int st[N], l[N], r[N];

signed main()
{
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	int n, k; cin >> n >> k;
	priority_queue<pii, vector<pii>, greater<pii>>q;
	for(int i = 0; i < n; i ++)
	{
		cin >> st[i];
		q.push({st[i], i});
        l[i] = i - 1;//模拟链表,链接左右两侧节点 
		r[i] = i + 1;
		if(r[i] == n)
			r[i] = -1;
	}

	int cnt = k;
	while(k)
	{
		pii t = q.top();
        q.pop();

		if(t.first != st[t.second])
		{
			q.push({st[t.second], t.second});
			continue;
		}

		k --;
        int pos = t.second;
        //将该元素的相邻元素加上该数值
		if(l[pos] >= 0)
		    st[l[pos]] += t.first;
        if(r[pos] >= 0)
		    st[r[pos]] += t.first;
			//更新相邻点的相邻元素,模拟链表删除元素 
		if(l[pos] >= 0)
		    r[l[pos]] = r[pos];
		if(r[pos] >= 0)
		    l[r[pos]] = l[pos];
        //该元素已经被删除,打标记,方便最后输出结果 
		st[pos] = -1;
	}
	for(int i = 0; i < n; i ++)
	{
		if(st[i] != -1)
			cout << st[i] << " ";
	}
	cout << endl;
	return 0; 
}

优先队列:

priority_queue<pii, vector<pii>, greater<pii>>q;这里明确指出了vector是优先队列的底层容器,且存储的元素类型是pii,对于pair类型,greater<pii>是首先比较第一个元素,如果不同,则按照第一个元素排序,如果相同,则比较第二个元素。

priority_queue<数据类型> q; 默认是大顶堆,即从大到小排列;

priority_queue<数据类型,vector<数据类型>,greater<数据类型>> q;表示从大到小排列;

自定义排序:

 


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

相关文章:

  • 华为小米vivo向上,苹果荣耀OPPO向下
  • STM32单片机学习记录(2.2)
  • 华为云kubernetes部署deepseek r1、ollama和open-webui(已踩过坑)
  • Starrocks 对比 Clickhouse
  • 【Elasticsearch】 Intervals Query
  • Kamailio、MySQL、Redis、Gin后端、Vue.js前端等基于容器化部署
  • 今日AI和商界事件(2025-02-05)
  • punkt缺失问题
  • 定时任务单线程消费 redis 中数据导致消费能力不足
  • Docker深度解析:部署 SpringBoot 项目
  • TensorFlow是个啥玩意?
  • 学习threejs,pvr格式图片文件贴图
  • 108,【8】 buuctf web [网鼎杯 2020 青龙组]AreUSerialz
  • 每日Attention学习18——Grouped Attention Gate
  • 探索巨控GRM240系列远程模块的强大功能:物联应用新选择
  • deepseek、qwen等多种模型本地化部署
  • RabbitMQ 深度解析与最佳实践
  • 【LeetCode 刷题】贪心算法(1)-基础
  • React开发中箭头函数返回值陷阱的深度解析
  • 利用TensorFlow.js实现浏览器端机器学习:一个全面指南
  • 机器学习专业毕设选题推荐合集 人工智能
  • 4 HBase 的高级 shell 管理命令
  • [基础]端口隔离实验
  • Elasticsearch 就业形势
  • C++STL(二)——vector
  • 基于springboot河南省旅游管理系统