题目大意:
输入m个数集,每个含n个数,求从每个集合取一个数后,按非降序输出前n小的和
注意:这题的m,n是反着的
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<queue> using namespace std; int T,n,m,sum,num,len; int a[2005],old[2005]; int main() { scanf("%d",&T); for(;T>0;T--) { scanf("%d%d",&n,&m); for(int j=1;j<=m;j++) scanf("%d",&old[j]); sort(old+1,old+1+m); sort(old+1,old+1+m); for(int i=2;i<=n;i++) { for(int j=1;j<=m;j++) scanf("%d",&a[j]); sort(a+1,a+m+1); priority_queue<int> Q; for(int j=1;j<=m;j++) Q.push(a[1]+old[j]); for(int k=2;k<=m;k++) { bool flag=0; for(int j=1;j<=m;j++) { if (Q.top()>old[j]+a[k]) { Q.pop(); Q.push(old[j]+a[k]); flag=1; } else break; } if (!flag) break; } int l=m; while(!Q.empty()) { old[l--]=Q.top(); Q.pop(); } } for(int i=1;i<=m;i++) { printf("%d",old[i]); if (i==m) printf(" "); else printf(" "); } } return 0; }