序列合并 洛谷1631 堆
来源:互联网 发布:淘宝助理上传中断 编辑:程序博客网 时间:2024/06/10 05:39
题目描述
有两个长度都是N的序列A和B,在A和B中各取一个数相加可以得到N^2个和,求这N^2个和中最小的N个。
输入格式:
第一行一个正整数N;
第二行N个整数Ai,满足Ai<=Ai+1且Ai<=10^9;
第三行N个整数Bi, 满足Bi<=Bi+1且Bi<=10^9.
[数据规模]
对于50%的数据中,满足1<=N<=1000;
对于100%的数据中,满足1<=N<=100000。
输出格式:
输出仅一行,包含N个整数,从小到大输出这N个最小的和,相邻数字之间用空格隔开。
Solution
类似之前的最小函数值,分别记录第一排乘到哪一位,每次取堆顶然后后移压入
Code
#include <stdio.h>#include <string.h>#include <queue>#include <vector>#include <algorithm>#define rep(i, st, ed) for (int i = st; i <= ed; i += 1)#define drp(i, st, ed) for (int i = st; i >= ed; i -= 1)#define fill(x, t) memset(x, t, sizeof(x))#define N 100001using std:: vector;vector<int> v;vector<int> a;struct rec{ int x, cal; bool operator <(const rec &b) const{ rec a = *this; return a.x + v[a.cal] > b.x + v[b.cal]; }};inline int read(){ int num = 0, v = 1; char ch = getchar(); while (ch < '0' || ch > '9'){ if (ch == '-'){ v = -1; } ch = getchar(); } while (ch >= '0' && ch <= '9'){ num = (num << 1) + (num << 3) + ch - '0'; ch = getchar(); } return num * v;}using std:: priority_queue;int main(void){ int n = read(); priority_queue<rec> heap; rep(i, 1, n){ int x = read(); a.push_back(x); } rep(i, 1, n){ int x = read(); v.push_back(x); } sort(v.begin(), v.end()); drp(i, n - 1, 0){ heap.push((rec){a[i], 0}); } while (n --){ rec prt = heap.top(); heap.pop(); printf("%d ", prt.x + v[prt.cal]); heap.push((rec){prt.x, prt.cal + 1}); } printf("\n"); return 0;}
0 0
- 序列合并 洛谷1631 堆
- 洛谷 1631 序列合并 堆 解题报告
- |洛谷|堆|P1631 序列合并
- 洛谷 堆专题 序列合并
- 堆or优先队列(洛谷1631 序列合并)
- 洛谷1631 序列合并
- 洛谷 P1631 序列合并
- 洛谷P1631 序列合并
- 洛谷P1631 序列合并
- 洛谷 P1631 序列合并
- 洛谷 P1631 序列合并
- 洛谷P1631 序列合并
- 洛谷 P1631 序列合并
- 洛谷P1631 序列合并
- 洛谷 P1631 序列合并
- 【洛谷】P1628 合并序列
- [luogu]P1631序列合并-堆排的套路运用
- 【堆】洛谷 P1090 合并果子
- 函数中参数是否有var的区别
- C++ const关键字的作用
- 【Unity学习笔记】NPC朝向玩家的代码实现
- Android通过Post上传数据和图片到Servlet
- 最接近0的数组子序列
- 序列合并 洛谷1631 堆
- 线程也疯狂----线程同步(1)
- C#中get与set
- 2.14情人节还是情人劫?海南大宗开户有返佣吗
- 00003 不思议迷宫.0001:解密Lua脚本
- PAT-B 1006. 换个格式输出整数 (15)
- 乔姆斯基语言体系
- 简单冒泡排序算法
- 关于java默认构造器的问题