Uva11997——优先队列,多路合并
2013-04-08 08:45
344 查看
题意:给出k个长度为k的整数数组,每个数组里面取一个元素加起来,共有k^k个和,输出这些和的前k个(升序排序后)。
经典的多路合并问题,用一个优先队列维护k个值,每次pop出最小值之后将其下一个值加入队列。但是这题有k个数组,我们可以每次合并两个数组,求出前k个(后面的值我们肯定用不着了),接着再和下一个数组合并。
经典的多路合并问题,用一个优先队列维护k个值,每次pop出最小值之后将其下一个值加入队列。但是这题有k个数组,我们可以每次合并两个数组,求出前k个(后面的值我们肯定用不着了),接着再和下一个数组合并。
#include <iostream> #include <cstdio> #include <cstring> #include <queue> #include <algorithm> using namespace std; const int maxn = 1000; int arr1[maxn], arr2[maxn], k; struct pp { int s, b; pp(int aa, int bb) : s(aa), b(bb) { } bool operator < (const pp & rhs) const { return s > rhs.s; } }; int main() { freopen("in.txt", "r", stdin); while(~scanf("%d", &k)) { for(int i = 0; i < k; ++i) scanf("%d", arr1 + i); sort(arr1, arr1 + k); for(int i = 1; i < k; ++i) { for(int j = 0; j < k; ++j) scanf("%d", arr2 + j); sort(arr2, arr2 + k); priority_queue<pp> pq; for(int j = 0; j < k; ++j) pq.push(pp(arr1[j] + arr2[0], 0)); for(int j = 0; j < k; ++j) { pp tem = pq.top(); pq.pop(); arr1[j] = tem.s; if(tem.b == k - 1) continue; tem.s = tem.s - arr2[tem.b] + arr2[tem.b + 1]; tem.b++; pq.push(tem); } } for(int i = 0; i < k - 1; ++i) printf("%d ", arr1[i]); printf("%d\n", arr1[k - 1]); } return 0; } /* 3 1 8 5 9 2 5 10 7 6 2 1 1 1 2 9 10 12 2 2 */
相关文章推荐
- 【优先队列之多路合并】UVA - 11997 K Smallest Sums
- uva11997 K Smallest Sums&&UVALive 3135 Argus(优先队列,多路归并)
- uva 11997 k个最小和(优先队列实现多路归并)题解
- K Smallest Sums(Uva 11997) 多路归并+优先队列
- UVa - 11997 K Smallest Sums(优先队列多路归并)
- Uva11997 优先级队列的应用 多路合并问题
- 多路归并优先队列——UVA 11997
- uva 11997 K smallest sums (优先队列 多路归并)
- UVa 11997 (优先队列 多路归并) K Smallest Sums
- UVa 11997 K Smallest Sums - 优先队列
- uva 11997 优先队列
- UVA 11997 K Smallest Sums(多路合并)
- UVa 11997 K Smallest Sums (优先队列 & k路归并化为两两归并)
- 优先队列 UVA 11997 K Smallest Sums
- 【优先队列之多路归并】UVALive 3135 Argus
- 优先队列uva11997(好)
- uva 11997 STL 优先队列priority_queue +简单数学
- 指南 第三章 例题3 UVALive 3135 Argus(优先队列的应用)
- UVA 11997 Smallest Sums(有序表合并,多维变一维)
- 优先队列的多路归并问题