Sequence
-
总时间限制:
- 3000ms 内存限制:
- 65536kB
-
描述
-
给定m个数字序列,每个序列包含n个非负整数。我们从每一个序列中选取一个数字组成一个新的序列,显然一共可以构造出n^m个新序列。接下来我们对每一个新的序列中的数字进行求和,一共会得到n^m个和,请找出最小的n个和
输入
-
输入的第一行是一个整数T,表示测试用例的数量,接下来是T个测试用例的输入
每个测试用例输入的第一行是两个正整数m(0 < m <= 100)和n(0 < n <= 2000),然后有m行,每行有n个数,数字之间用空格分开,表示这m个序列
序列中的数字不会大于10000
输出
- 对每组测试用例,输出一行用空格隔开的数,表示最小的n个和 样例输入
-
1 2 3 1 2 3 2 2 3
样例输出
-
3 3 4
#include<iostream> #include<cmath> #include<cstring> #include<algorithm> #include<iomanip> #include<queue> #include<stack> #include<vector> #include<set> #include<map> using namespace std; int a[2005]={0}; int b[2005]={0}; int main() { int Test; cin>>Test; while(Test--) { int m,n; cin>>m>>n; priority_queue<int>q; for(int i=0;i<n;++i) { cin>>a[i]; } sort(a,a+n); if(m==1) { for(int i=0;i<n;++i) { cout<<a[i]<<" "; } cout<<endl; continue; } for(int k=0;k<m-1;++k) { for(int j=0;j<n;++j) { cin>>b[j]; } sort(b,b+n); for(int i=0;i<n;++i) { q.push(a[i]+b[0]); } for(int j=1;j<n;++j) { int t; for(t=0;t<n;++t) { if(a[t]+b[j]<q.top()) { q.pop(); q.push(a[t]+b[j]); } else break; } if(t==0)break; } for(int i=n-1;i>=0;--i) { a[i]=q.top(); q.pop(); } } for(int i=0;i<n;++i) { cout<<a[i]<<" "; } cout<<endl; } return 0; }