poj2442优先队列
Posted 远搏
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了poj2442优先队列相关的知识,希望对你有一定的参考价值。
- 感谢
- http://hi.baidu.com/%C0%B6%C9%ABarch/blog/item/f9d343f49cd92e53d7887d73.html
- 的博主!
- 思路:
- 我们要找到n个smallest的数,用贪心法可以解决这一问题。
- (1)维护两个数组,a和b,以及一个大根堆p
- 循环不变式:
- (1)初始化
- 将元素读入a,将a排序(从小到大)
- 执行并重复(2)
- (2)保持
- 对于这全部数据第二行到第m行(从第二行开始,因为第一行读到a里了)
- 将元素读入b,将b排序(从小到大)
- For i = 0 to n -1
- heap.push(a[i]+b[0]);
- 然后
- for(int i = 1; i < n;i++)
- {
- for(int j = 0 ; j < n; j++)
- {
- if( (b[i] + a[j]) > heap.top() ) break;
- heap.pop(); ///从heap中删除一个最大的元素,从而保证heap中元素数目不变
- heap.push(b[i] + a[j]);
- }
- }
- /////这样,就选出了n个最小值
- 然后把heap中的n个值按照从小到大给
- a[1] -> a[n],并将heap清空。
- 执行(2)
- (3)最终结果
- 输出a中全部元素就可以了,注意,对于每个case都要换行哦!
-
#include <iostream> #include <stdio.h> #include <queue> #include <math.h> #include <string> #include <algorithm> using namespace std; bool cmp(int a,int b) { return a<b; } int main() { int a[2010],b[2010]; int n,m,i,j,t,y; cin>>t; while(t--) { scanf("%d%d",&m,&n); for(i=0;i<n;i++) scanf("%d",&a[i]); sort(a,a+n,cmp); priority_queue <int> q; for(i=1;i<m;i++) { for(j=0;j<n;j++) scanf("%d",&b[j]); sort(b,b+n,cmp); for(j=0;j<n;j++) { q.push(b[0]+a[j]); } for(j=1;j<n;j++) { for(y=0;y<n;y++) { if(a[y]+b[j]>=q.top()) break; q.pop(); q.push(a[y]+b[j]); } } for(j=0;j<n;j++) { a[n-1-j]=q.top(); q.pop(); } } for(i=0;i<n;i++) { if(i==0) printf("%d",a[i]); else printf(" %d",a[i]); } cout << endl; } return 0; }
以上是关于poj2442优先队列的主要内容,如果未能解决你的问题,请参考以下文章