标签:
算法入门经典 训练指南 p189
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<queue> using namespace std; struct Item { int s,b; Item(int s,int b) :s(s),b(b) {} bool operator < (const Item&rhs) const {return s>rhs.s;} }; void merge(int *A,int *B,int *C,int n) { 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 item=q.top(); q.pop(); C[i]=item.s; int b=item.b; if(b+1<n) q.push(Item(item.s-B[b]+B[b+1],b+1)); } } const int maxn=768; 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); printf("%d",A[0][0]); for(int i=1;i<n;i++) printf(" %d",A[0][i]); printf("\n"); } return 0; }
uva 11997 K smallest sums (优先队列 多路归并)
标签:
原文地址:http://www.cnblogs.com/sola1994/p/4262591.html