2016 UESTC Training for Data Structures D - 卿学姐与魔法 CDOJ 1329 堆
来源:互联网 发布:尤克里里打谱软件 编辑:程序博客网 时间:2024/04/29 03:52
D题:卿学姐与魔法
就是有两个长度为N的序列A和B,N<=1e5,
然后输出A[i]+B[j](i可以等于j)组成的N*N个数中最小的N个
可以用小根堆,也可以不用堆。
用堆的做法,把A数组升序排序,B可排可不排,然后可以得到N个序列
A[0]+B[0],A[1]+B[0],A[2]+B[0]....A[N-1]+B[0]
A[0]+B[1],A[1]+B[1],A[2]+B[1]....A[N-1]+B[1]
.....
A[0]+B[N-1],A[1]+B[N-1],A[2]+B[N-1]....A[N-1]+B[N-1]
然后我们把每个序列的第一个值都放入小根堆中,那么堆顶的元素一定就是最小的元素,假如这个数是A[i]+B[j],然后就把这个数弹出,把A[i+1]+B[j]加入到堆中,调整,然后堆顶元素也一定是最小的,再这样弹出+加入,弹出N个数,这N个数一定是最小的N个数。
我的代码就是这么写的,类似于一种N路归并排序的做法
还有一种做法就是不用堆的做法,
把A数组和B数组都升序排序,
然后设置两个游标i和j,初始i和j都为0,因为A[0]+B[0]一定是最小的,然后后面有两种情况一种是++i,一种是++j,然后选取得到数小的那种,然后就这样啊,移动N次,得到N个数,这N个就是最小的N个数,这种做法我没去验证,但是应该是对的
代码:
#include <iostream>#include <cstdio>#include <algorithm>#include <cmath>#include <set>using namespace std;#define ll long long#define maxn 100005int N, a[maxn], b[maxn], ans[maxn];struct Node{int num, ai, bi;Node(){}Node(int n, int a, int b){num = n, ai = a, bi = b;}void make(int n, int a, int b){num = n, ai = a, bi = b;}bool operator <(Node x)const{return num < x.num;}bool operator >(Node x)const{return num > x.num;}};Node heap[maxn];void heap_update(){int k = 1;while (k <= N / 2){if (heap[k] > heap[2 * k]){if (heap[k] > heap[2 * k + 1]){if (heap[2 * k] > heap[2 * k + 1]){Node t = heap[2 * k + 1];heap[2 * k + 1] = heap[k];heap[k] = t;k = 2 * k + 1;}else{Node t = heap[2 * k];heap[2 * k] = heap[k];heap[k] = t;k = 2 * k;}}else{Node t = heap[2 * k];heap[2 * k] = heap[k];heap[k] = t;k = 2 * k;}}else if (heap[k] > heap[2 * k + 1]){Node t = heap[2 * k + 1];heap[2 * k + 1] = heap[k];heap[k] = t;k = 2 * k + 1;}elsebreak;}}int main(){//freopen("input.txt", "r", stdin);scanf("%d", &N);for (int i = 0; i < N; ++i)scanf("%d", &a[i]);for (int i = 0; i < N; ++i)scanf("%d", &b[i]);sort(a, a + N);sort(b, b + N);for (int i = 0; i < N; ++i){heap[i + 1].make(a[i] + b[0], i, 0);}for (int i = N; i > 1; --i){if (heap[i] < heap[i / 2]){Node t = heap[i / 2];heap[i / 2] = heap[i];heap[i] = t;}}for (int i = 0; i < N; ++i){ans[i] = heap[1].num;heap[1].num = a[heap[1].ai] + b[heap[1].bi + 1];++heap[1].bi;heap_update();}for (int i = 0; i < N; ++i)printf("%d\n", ans[i]);//system("pause");//while (1);return 0;}
0 0
- 2016 UESTC Training for Data Structures D - 卿学姐与魔法 CDOJ 1329 堆
- 2016 UESTC Training for Data Structures D - 卿学姐与魔法 优先队列、构造
- 2016 UESTC Training for Data Structures A - 卿学姐与公主 CDOJ 1324 线段树
- 2016 UESTC Training for Data Structures B - 卿学姐与基本法 CDOJ 1325 线段树+离散化
- 2016 UESTC Training for Data Structures C - 卿学姐与诡异村庄 CDOJ 1328 并查集
- 2016 UESTC Training for Data Structures C -> 卿学姐与诡异村庄 CDOJ 1328 并查集
- 2016 UESTC Training for Data Structures G - 郭大侠与阴阳家 CDOJ 1337 强行map
- 2016 UESTC Training for Data Structures J - 郭大侠与Rabi-Ribi CDOJ 1334 优先队列
- 2016 UESTC Training for Data Structures K - 郭大侠与甲铁城 CDOJ 1342 离线树状数组
- 2016 UESTC Training for Data Structures L - 郭大侠与苦恼 CDOJ 1284 map+启发式合并
- 2016 UESTC Training for Data Structures E - 卿学姐与城堡的墙 CDOJ 1341 树状数组 逆序对 离散化
- 2016 UESTC Training for Data Structures M - 卿学姐失恋了Ⅱ CDOJ 1350 汉诺塔 模拟
- CDOJ-1592 (2017 UESTC Training for Data Structures B)
- 2016 UESTC Training for Data Structures H - 郭大侠与英雄学院 CDOJ 1338 并查集
- 2016 UESTC Training for Data Structures I - 郭大侠与线上游戏 CDOJ 1339 pb_ds黑科技
- 2016 UESTC Training for Data Structures B - 卿学姐与基本法 自己构建了一个和堆有点像的数据结构
- 2016 UESTC Training for Data Structures P - 浑身难受 CDOJ 1276 树状数组
- 2016 UESTC Training for Data Structures Q - 昊昊爱运动 II CDOJ 1259 线段树+bitset
- 334. Increasing Triplet Subsequence
- 2016 UESTC Training for Data Structures C - 卿学姐与诡异村庄 CDOJ 1328 并查集
- Tiny Web服务器代码分析
- Nginx源码分析-核心模块剖析及常见问题
- 1000: A+B Problem
- 2016 UESTC Training for Data Structures D - 卿学姐与魔法 CDOJ 1329 堆
- hdu5676 ztr loves lucky numbers 【打表】
- VNC复制和粘贴
- 【前端框架】Backbone.js在大型单页面应用中的应用实践
- 2016 UESTC Training for Data Structures E - 卿学姐与城堡的墙 CDOJ 1341 树状数组 逆序对 离散化
- gmp大数运算库 window下安装配置和使用(下)
- [git]ssh: Could not resolve hostname github.com: nodename nor servname provided, or not known
- 2016 UESTC Training for Data Structures F - 郭大侠与“有何贵干?” CDOJ 1335 线段树 扫描线 离散化
- camer驱动模块加载分析