Uva11997 优先级队列的应用 多路合并问题
2013-08-25 13:01
423 查看
这题的题意就是给你k个数组,没个数组里有k个值,然后让你求从这k个数组中取一个数,所得的前k个最小的和。
这里应用到了优先级队列,先合并两个数组,求出最小的k个和,然后依次合并其他数组。
这里对于优先级队列的内部函数写的还是不很熟练,以后应该会好点。
代码:
这里应用到了优先级队列,先合并两个数组,求出最小的k个和,然后依次合并其他数组。
这里对于优先级队列的内部函数写的还是不很熟练,以后应该会好点。
代码:
#include<iostream> #include<cstdio> #include<vector> #include<string> #include<queue> #include<algorithm> #include<cstring> #define maxn 1000 #define INF 0xfffffff #define mem(a,b) memset(a,b,sizeof(a)) #define FOR(i,s,t) for(int i=s;i<=t;i++) #define ull unsigned long long #define ll long long using namespace std; struct Item { int s,b;//s=A[i]+B[b]; Item(int s,int b):s(s),b(b){} bool operator < (const Item& it)const//注意这里是const& { return s>it.s; } }; void merge(int *A,int *B,int *C,int n)//注意这里的A和B都是有序的 { priority_queue<Item> q; for(int i=0;i<n;i++) { q.push(Item(A[i]+B[0],0)); } for(int i=0;i<n;i++) { Item it=q.top();q.pop(); C[i]=it.s; int b=it.b; if(b+1<n) { q.push(Item(it.s-B[b]+B[b+1],b+1)); } } } int A[maxn][maxn]; int main() { int n; while(scanf("%d",&n)==1) { for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { scanf("%d",&A[i][j]); } sort(A[i],A[i]+n); } for(int i=1;i<n;i++)//两两结合 { merge(A[0],A[i],A[0],n); } for(int i=0;i<n;i++) { if(!i) printf("%d",A[0][i]); else printf(" %d",A[0][i]); } printf("\n"); } return 0; }
相关文章推荐
- 【优先队列之多路合并】UVA - 11997 K Smallest Sums
- Uva11997——优先队列,多路合并
- UVa 11997 (优先队列 多路归并) K Smallest Sums
- 堆的实现及应用(优先级队列,堆排,TopK问题)
- 多路归并优先队列——UVA 11997
- UVa - 11997 K Smallest Sums(优先队列多路归并)
- uva11997 K Smallest Sums&&UVALive 3135 Argus(优先队列,多路归并)
- UVA 11997之多路归并问题求解
- uva 11997 K smallest sums (优先队列 多路归并)
- (UVa 11997)K Smallest Sums --多路归并问题,优先队列
- K Smallest Sums(Uva 11997) 多路归并+优先队列
- UVA 11997 K Smallest Sums(多路合并)
- uva 11997 k个最小和(优先队列实现多路归并)题解
- priority_queue 优先级队列的基本应用和重载问题
- 紫书章五例题七 丑数 UVa 136(多种方法,在这里介绍优先级队列)
- java中自己用过的数据结构(队列Queue、优先级队列PriorityQueue和栈Stack),及其分别的应用场景
- uva 12100 Printer Queue 优先级队列模拟题 数组模拟队列
- HYSBZ 1216 操作系统 优先级队列的应用
- 数据结构算法问题 栈与队列的应用
- 基于堆实现的优先级队列:PriorityQueue 解决 Top K 问题