嗯...

题目链接: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代码:

 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 序列合并相关推荐

  1. [优先队列] 洛谷 P1631 序列合并

    题目描述 有两个长度都是N的序列A和B,在A和B中各取一个数相加可以得到N^2N2个和,求这N^2N2个和中最小的N个. 输入输出格式 输入格式: 第一行一个正整数N: 第二行N个整数A_iAi​, ...

  2. 洛谷 一种堆套路 P1631序列合并、P2085最小函数值

    题目链接 序列合并 最小函数值 题解 这两道题做法基本一样,是使用同一种套路解决的,这里用序列合并来举例说明. 序列合并要求出N2N2N^2个和中最小的N个数. 我们用一个堆来维护我们需要的数,并且保 ...

  3. P1631 序列合并

    题目描述 有两个长度都是N的序列A和B,在A和B中各取一个数相加可以得到N^2个和,求这N^2个和中最小的N个. 输入输出格式 输入格式: 第一行一个正整数N: 第二行N个整数Ai,满足Ai<= ...

  4. 贪心算法——洛谷(P1090)[NOIP2004]合并果子

    该题目也属于经典的贪心算法,在这里熟悉C++里优先队列的使用. 需要导入头文件:   #include<queue> 从这个问题可以深挖出神奇的哈夫曼树问题. 因为这题里合并的是二叉树,所 ...

  5. 【洛谷1090】合并果子

    题目描述 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆. 每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和.可 ...

  6. 洛谷 P1645 序列 贪心

    题目描述 有一个整数序列,它的每个数各不相同,我们不知道它的长度是多少(即整数个数),但我们知道在某些区间中间至少有多少个整数,用区间(Li,Ri,Ci)来描述,表示这个整数序列中至少有Ci个数来自区 ...

  7. 洛谷P1775 石子合并(弱化版)

    原题传送门 题目描述 设有 N(N≤300)N(N \le 300)N(N≤300) 堆石子排成一排,其编号为1,2,3,⋯,N1,2,3,\cdots,N1,2,3,⋯,N.每堆石子有一定的质量 m ...

  8. 洛谷 P1645 序列

    炒鸡明显的贪心题,主要就想让一段区间与另一段里面重合的数越多越好. 于是先按照区间右端排序,然后尽可能的把数都往右靠拢,最后与另一段区间的前面的重合.. 然后可以用个flag来记录哪些数被选了什么的. ...

  9. 洛谷 深基 第4部分 基础数学与数论(19-21课)

    洛谷 深基 第4部分 基础数学与数论  第19章 位运算与进制转换 P1143 进制转换 https://www.luogu.com.cn/problem/P1143 洛谷P1143 进制转换的Pyt ...

最新文章

  1. 收藏!最新大数据产业地图 十大生态金矿百大公司起底【附下载】
  2. SSO CAS 探究
  3. wxWidgets:wxDialUpManager类用法
  4. javaweb如何定位
  5. Python 爬虫利器一之 Requests 库的用法
  6. 【Kafka】nable to write to standard out, closing consumer Console consumer process hangs on SIGINT
  7. Linux开发板-串口连接成功后界面空白问题
  8. Python_day19--HTML基础--文本标签、超链接标签、图片标签
  9. 写给没时间理财的上班族
  10. 大胖子走迷宫 [蓝桥杯 ]
  11. edge浏览器添加新标签页问题
  12. 微信公众号服务器配置url,微信公众号平台设置服务器地址(URL)和令牌(Token)配对启用方法...
  13. FPGA中CDC问题
  14. 跨页面清除Cookie信息
  15. 是德N9030B频谱分析仪主要特性和功能
  16. Windows server 2019 - 磁盘加密(BitLocker)
  17. 计算机毕设Node.js+Vue兴澜幼儿园管理系统(程序+LW+部署)
  18. 段视频伪原创 手机如何去除视频md5
  19. 5W1H聊开源之What——开源是什么?
  20. Sofa framework 学习笔记

热门文章

  1. python程序编译成exe格式
  2. 内部排序比较(Java版)
  3. [求助]请教一个问题!
  4. 输出斐波那契数列的第n项
  5. 高精度小数 mooc 翁恺c 语言
  6. oracle any 语法,Oracle Any/Some
  7. Python中的第三方模块(微信为例)
  8. shell中的文本处理(grep、sed、awk命令)
  9. python exceptions怎么用_Python基础介绍 | Exceptions异常
  10. imwrite函数 matlab_用matlab做一个脉动磁势分解的动画