描述

给定一个包含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 }

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2022-02-10
  • 2021-08-06
  • 2022-12-23
  • 2021-11-04
  • 2022-01-17
  • 2021-12-12
猜你喜欢
  • 2021-06-22
  • 2021-10-05
  • 2022-01-13
  • 2021-07-03
  • 2021-09-15
  • 2021-12-17
  • 2022-01-05
相关资源
相似解决方案