UESTC-2020ACM练习二Q题 输出前m大的数

给你n个整数, 请按从大到小的顺序输出其中前m大的数.

Standard Input
题目包含多组测试数据, 第一行是整数T, 表示测试数据的组数. 每组测试数据有两行, 第一行有两个数nm(0<n,m<1000000), 第二行包含n个处于区间[−500000,500000]的整数, 每个数后有一个空格.

Standard Output
对应每组测试数据按从大到小的顺序输出一行前m大的数, 每个数后应有一个空格.

Samples

Input
1
5 3
3 -35 92 213 -644

Output
213 92 3

这一题用冒泡或者sort等通过比较大小的排序方式来做都是会超时的,可以采用Hash的方式。
数据的范围是[−500000,500000],对每个数加500000,范围就变成了【0,1000000】,建立一个大小为1000000的数组a并用memset初始化为0;
注:memset函数初始化只能为0或者-1!
每读入一个数num,我们就将a[ num+500000] 加一,通过数组的值记录某个数的数量。
在找前m大的数时,只需要从a[ 999999 ] 往前搜索,如果数组值不为0,就输出其下标减去500000,并将此数组值m的值减一,直到m的值减为0(即前m大的数输出完毕)。

//Hash
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
#define N 1000000
int a[N];
int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        int m,n;
        cin>>n>>m;
        memset(a,0,sizeof(a));
        int num;
        for(int i=0;i<n;i++)
        {
            cin>>num;
            a[num+N/2]++;
        }
        for(int i=N-1;m>0;)
        {
            if(a[i]!=0)
            {
                cout<<i-N/2<<' ';
                a[i]--;
                m--;
            }
            else
                i--;
        }
        cout<<endl;
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

想打球的码农

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值