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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值