描述
给定一个包含N(N<=3000)个正整数的序列,每个数不超过5000,对它们两两相加得到的N*(N-1)/2个和,求出其中前M大的数(M<=10000)并按从大到小的顺序排列。
输入
输入可能包含多组数据,其中每组数据包括两行:
第一行两个数N和M,
第二行N个数,表示该序列。
输出
对于输入的每组数据,输出M个数,表示结果。输出应当按照从大到小的顺序排列。
样例输入
4 4
1 2 3 4
4 5
5 3 6 4
样例输出
7 6 5 5
11 10 9 9 8
题意
求出两两相加前m大的值
题解
先预处理一下,把每两个的和放入数组中
代码
1 #include<stdio.h> 2 int main() 3 { 4 int n,m; 5 while(scanf("%d%d",&n,&m)!=EOF) 6 { 7 int a[3005],b[10001]={0},maxx=0; 8 for(int i=0;i<n;i++) 9 scanf("%d",&a[i]); 10 for(int i=0;i<n;i++) 11 { 12 for(int j=i+1;j<n;j++) 13 { 14 b[a[i]+a[j]]++; 15 if(a[i]+a[j]>maxx) 16 maxx=a[i]+a[j]; 17 } 18 } 19 printf("%d",maxx); 20 b[maxx]--; 21 m--; 22 int f=0; 23 for(int i=maxx;i>=0;i--) 24 { 25 for(int j=b[i];j>0;j--) 26 { 27 if(m-->0) 28 printf(" %d",i); 29 else 30 { 31 f=1;break; 32 } 33 } 34 if(f)break; 35 } 36 puts(""); 37 } 38 return 0; 39 }