洛谷 P1631 序列合并
嗯...
题目链接:https://www.luogu.org/problem/P1631
这道题很明显的是一个堆的问题,要开一个结构体的堆(结构体中记录下标、内容、个数)...
首先,把A和B两个序列分别从小到大排序,变成两个有序队列。
然后从A和B中各任取一个数相加得到N2个和,可以把这些和看成形成了n个有序表/队列:
A[1]+B[1] <= A[1]+B[2] <= … <= A[1]+B[N]
A[2]+B[1] <= A[2]+B[2] <= … <= A[2]+B[N]
……
A[N]+B[1] <= A[N]+B[2] <= … <= A[N]+B[N]
接下来,就相当于要将这N个有序队列进行合并排序:
首先,将这N个队列的队首放入一个堆中;然后,每次取出堆中的最小值。若这个最小值来自于第k个队列,那么,就将第k个队列的下一个元素放入堆中。
时间复杂度:O(NlogN)。
细节:
1.结构体堆一定要重载运算符
2.id是这一行的第几个元素,cnt是第cnt行(也可这样理解,cnt记录第cnt个a,id记录第id个b)
AC代码:
![](/assets/blank.gif)
![](/assets/blank.gif)
1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<queue> 5 6 using namespace std; 7 8 const int maxn = 100005; 9 10 int cnt; 11 12 struct node{ 13 int id, nr, cnt; 14 } p[maxn];//结构体 15 16 bool operator < (node x, node y){ 17 return x.nr > y.nr; 18 }//重载运算符 19 20 priority_queue <node> q; 21 22 int n, a[maxn], b[maxn]; 23 24 int main(){ 25 scanf("%d", &n); 26 for(int i = 1; i <= n; i++){ 27 scanf("%d", &a[i]); 28 p[i].id = i; 29 p[i].cnt = 1; 30 } 31 for(int i = 1; i <= n; i++) scanf("%d", &b[i]); 32 sort(a + 1, a + n + 1); 33 sort(b + 1, b + n + 1); 34 for(int i = 1; i <= n; i++){ 35 p[i].nr = a[1] + b[i]; 36 q.push(p[i]); 37 } 38 for(int i = 1; i <= n; i++){ 39 int ans = q.top().nr; 40 printf("%d ", ans); 41 node u; 42 u.cnt = q.top().cnt + 1; 43 u.id = q.top().id; 44 q.pop(); 45 u.nr = a[u.cnt] + b[u.id]; 46 q.push(u); 47 } 48 return 0; 49 }
AC代码
转载于:https://www.cnblogs.com/New-ljx/p/11246614.html
洛谷 P1631 序列合并相关推荐
- [优先队列] 洛谷 P1631 序列合并
题目描述 有两个长度都是N的序列A和B,在A和B中各取一个数相加可以得到N^2N2个和,求这N^2N2个和中最小的N个. 输入输出格式 输入格式: 第一行一个正整数N: 第二行N个整数A_iAi, ...
- 洛谷 一种堆套路 P1631序列合并、P2085最小函数值
题目链接 序列合并 最小函数值 题解 这两道题做法基本一样,是使用同一种套路解决的,这里用序列合并来举例说明. 序列合并要求出N2N2N^2个和中最小的N个数. 我们用一个堆来维护我们需要的数,并且保 ...
- P1631 序列合并
题目描述 有两个长度都是N的序列A和B,在A和B中各取一个数相加可以得到N^2个和,求这N^2个和中最小的N个. 输入输出格式 输入格式: 第一行一个正整数N: 第二行N个整数Ai,满足Ai<= ...
- 贪心算法——洛谷(P1090)[NOIP2004]合并果子
该题目也属于经典的贪心算法,在这里熟悉C++里优先队列的使用. 需要导入头文件: #include<queue> 从这个问题可以深挖出神奇的哈夫曼树问题. 因为这题里合并的是二叉树,所 ...
- 【洛谷1090】合并果子
题目描述 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆. 每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和.可 ...
- 洛谷 P1645 序列 贪心
题目描述 有一个整数序列,它的每个数各不相同,我们不知道它的长度是多少(即整数个数),但我们知道在某些区间中间至少有多少个整数,用区间(Li,Ri,Ci)来描述,表示这个整数序列中至少有Ci个数来自区 ...
- 洛谷P1775 石子合并(弱化版)
原题传送门 题目描述 设有 N(N≤300)N(N \le 300)N(N≤300) 堆石子排成一排,其编号为1,2,3,⋯,N1,2,3,\cdots,N1,2,3,⋯,N.每堆石子有一定的质量 m ...
- 洛谷 P1645 序列
炒鸡明显的贪心题,主要就想让一段区间与另一段里面重合的数越多越好. 于是先按照区间右端排序,然后尽可能的把数都往右靠拢,最后与另一段区间的前面的重合.. 然后可以用个flag来记录哪些数被选了什么的. ...
- 洛谷 深基 第4部分 基础数学与数论(19-21课)
洛谷 深基 第4部分 基础数学与数论 第19章 位运算与进制转换 P1143 进制转换 https://www.luogu.com.cn/problem/P1143 洛谷P1143 进制转换的Pyt ...
最新文章
- 收藏!最新大数据产业地图 十大生态金矿百大公司起底【附下载】
- SSO CAS 探究
- wxWidgets:wxDialUpManager类用法
- javaweb如何定位
- Python 爬虫利器一之 Requests 库的用法
- 【Kafka】nable to write to standard out, closing consumer Console consumer process hangs on SIGINT
- Linux开发板-串口连接成功后界面空白问题
- Python_day19--HTML基础--文本标签、超链接标签、图片标签
- 写给没时间理财的上班族
- 大胖子走迷宫 [蓝桥杯 ]
- edge浏览器添加新标签页问题
- 微信公众号服务器配置url,微信公众号平台设置服务器地址(URL)和令牌(Token)配对启用方法...
- FPGA中CDC问题
- 跨页面清除Cookie信息
- 是德N9030B频谱分析仪主要特性和功能
- Windows server 2019 - 磁盘加密(BitLocker)
- 计算机毕设Node.js+Vue兴澜幼儿园管理系统(程序+LW+部署)
- 段视频伪原创 手机如何去除视频md5
- 5W1H聊开源之What——开源是什么?
- Sofa framework 学习笔记