给你n个整数, 请按从大到小的顺序输出其中前m大的数.
Standard Input
题目包含多组测试数据, 第一行是整数T, 表示测试数据的组数. 每组测试数据有两行, 第一行有两个数n和m(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;
}