Description
设计算法把一个n个元素的整数集合(n为偶数)分成两个子集S1和S2,使得:每个新的集合中含有n/2个元素,且S1中的所有元素的和与S2中的所有元素的和的差最大。你的算法的时间复杂性是多少?
Input
输入的第一行是一个正整数m,表示测试例个数。接下来几行是m个测试例的数据,每个测试例的数据由两行组成,其中第一行为一个正整数n (n为偶数,且n<=500),表示原整数集合的长度,第二行给出这n个整数序列,整数之间用一个空格隔开。
Output
对于每个测试例输出两行,分别表示新生成的整数集合。其中,第一行是元素和比较小的整数集合,第二行是元素和比较大的整数集合,整数之间用一个空格隔开。整数集合要求从小到大输出。两个测试例的输出数据之间用一个空行隔开。
Sample Input
2 22 68 25 34 16 2 37 3 95 76 57 21 13 4 78 29 6 17 39 51 20 43 12 26 28 3 48 59 14 32 47 51 42 61 9 24 52 78 65 2 37 78 51 73 29 7 26 95 37 2
Sample Output
2 3 4 6 12 13 16 17 20 21 25 29 34 37 39 43 51 57 68 76 78 95 2 2 3 7 9 14 24 26 28 29 32 37 37 42 47 48 51 51 52 59 61 65 73 78 78 95
Hint
注意不要有多于的空格和空行
(行尾无空格和最后无空行)
KEY:排序,排完,分成两部分输出
Source:
#include < iostream >
#include < algorithm >
using namespace std;
int N;
int n;
int a[ 800 ];
int main()
... {
// freopen("fjnu_1768.in","r",stdin);
cin>>N;
int i,j;
int p;
for(i=1;i<=N;i++)
...{
cin>>n;
for(j=0;j<n;j++)
cin>>a[j];
sort(a,a+n);
for(p=0;p<n/2-1;p++)
cout<<a[p]<<" ";
cout<<a[p]<<endl;
for(p++;p<n-1;p++)
cout<<a[p]<<" ";
cout<<a[p]<<endl;
if(i<N) cout<<endl;
}
return 0;
}
#include < iostream >
#include < algorithm >
using namespace std;
int N;
int n;
int a[ 800 ];
int main()
... {
// freopen("fjnu_1768.in","r",stdin);
cin>>N;
int i,j;
int p;
for(i=1;i<=N;i++)
...{
cin>>n;
for(j=0;j<n;j++)
cin>>a[j];
sort(a,a+n);
for(p=0;p<n/2-1;p++)
cout<<a[p]<<" ";
cout<<a[p]<<endl;
for(p++;p<n-1;p++)
cout<<a[p]<<" ";
cout<<a[p]<<endl;
if(i<N) cout<<endl;
}
return 0;
}