题目链接: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 }