TZOJ 1242 求出前m大的数(预处理)

描述

给定一个包含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 }
原文地址:https://www.cnblogs.com/taozi1115402474/p/8417607.html