Uva 11997 多路归并

题目链接:https://uva.onlinejudge.org/external/119/11997.pdf

题意:

k*k的矩阵,从每一行中选一个元素加起来,可以得到 kk个和,求前 k 个最小值。

分析:

先把表头都放到优先队列中,每出一个,就从相应的表后面加一个。

 1 #include <bits/stdc++.h>
 2 
 3 using namespace std;
 4 
 5 const int maxn = 755;
 6 
 7 int A[maxn][maxn];
 8 
 9 struct Item {
10     int s,b;
11     bool operator < (const Item& rhs) const {
12         return s > rhs.s;
13     }
14 };
15 
16 void merga(int* A,int* B,int* C,int n) {
17     priority_queue<Item> Q;
18     for(int i=0;i<n;i++) {
19         Q.push((Item){A[i]+B[0],0});
20     }
21     
22     for(int i=0;i<n;i++) {
23         Item item = Q.top();Q.pop();
24         C[i] = item.s;
25         int b = item.b;
26         if(b+1<n) Q.push((Item){item.s-B[b]+B[b+1],b+1});
27     }
28 }
29 
30 int main(int argc, char** argv) {
31     int n;
32     while(scanf("%d",&n)!=EOF) {
33         for(int i=0;i<n;i++) {
34             for(int j=0;j<n;j++) {
35                 scanf("%d",&A[i][j]);
36             }
37             sort(A[i],A[i]+n);
38         }
39         
40         for(int i=1;i<n;i++) {
41             merga(A[0],A[i],A[0],n);
42         }
43         
44         printf("%d",A[0][0]);
45         for(int i=1;i<n;i++) {
46             printf(" %d",A[0][i]);
47         }
48         puts("");
49         
50     }
51     return 0;
52 }
View Code
原文地址:https://www.cnblogs.com/TreeDream/p/6612196.html