多路归并+优先队列的使用
#include <iostream> #include <cstdio> #include <queue> #include <algorithm> using namespace std; const int maxn=2000+10; int a[110][maxn],b[maxn],n,m; struct item { int s,b; item(int s,int b):s(s),b(b) { } }; bool operator < (item a,item b) { return a.s>b.s; } void solve(int * t1,int *t2,int *t3) { priority_queue<item> q; int i; for(i=0;i<n;i++) q.push(item(t2[0]+t1[i],0)); for(i=0;i<n;i++) { item tem=q.top(); q.pop(); t3[i]=tem.s; q.push(item(tem.s+t2[tem.b+1]-t2[tem.b],tem.b+1)); } } int main() { int t; cin>>t; while(t--) { scanf("%d%d",&m,&n); int i,j; for(i=0;i<m;i++) { for(j=0;j<n;j++) scanf("%d",&a[i][j]); sort(a[i],a[i]+n); } for(i=1;i<m;i++) solve(a[0],a[i],a[0]); printf("%d",a[0][0]); for(i=1;i<n;i++) printf(" %d",a[0][i]); printf("\n"); } return 0; }