NYOJ 634 万里挑一(优先队列)

本文探讨了排序算法和数据结构的应用,通过实例展示了如何使用优先队列优化算法效率。
 //题目链接
//http://acm.nyist.net/JudgeOnline/problem.php?pid=634
1
#include <iostream> 2 #include <cstdio> 3 #include <queue> 4 #include <algorithm> 5 using namespace std; 6 int a[100001], b[100001]; 7 struct node{ 8 int d; int b; 9 node(){} 10 node(int a, int b):d(a),b(b){} 11 bool operator < (const node& tmp) const{ 12 return d < tmp.d; //使队列维护从大到小的性质 13 } 14 }; 15 bool cmp(int ta, int tb){ 16 return ta > tb; 17 } 18 void merge(int *A, int *B, int *C, int n){ 19 priority_queue<node> pq; 20 int i; 21 for(i = 0; i < n; ++i) 22 pq.push(node(A[i] + B[0], 0)); //先入队列n个数(第一个是最大的) 23 for(i = 0; i < n; ++i){ 24 node tmp = pq.top(); pq.pop(); //每次最大的数出队列,并保存到数组C中 25 C[i] = tmp.d; 26 int b = tmp.b; 27 if(b + 1 < n) 28 pq.push(node(tmp.d - B[b] + B[b+1], b+1)); 29 //tmp.d = A[x] + B[b]; 30 //tmp.d - B[b] + B[b+1] 是小于等于tmp.d的一个数入队 31 } 32 } 33 int main() 34 { 35 int N, k, i; 36 while(scanf("%d%d",&N, &k) != EOF){ 37 for(i = 0; i < N; ++i) scanf("%d", &a[i]); 38 for(i = 0; i < N; ++i) scanf("%d", &b[i]); 39 sort(a, a+N, cmp); //从大到小排序 40 sort(b, b+N, cmp); 41 merge(a, b, a, k); 42 printf("%d", a[k-1]); 43 for(i = k-2; i >= 0; --i) 44 printf(" %d", a[i]); 45 puts(""); 46 } 47 return 0; 48 }

 

转载于:https://www.cnblogs.com/yaling/p/3193545.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值