Problem Description
给你n个整数,请按从大到小的顺序输出其中前m大的数。
Input
每组测试数据有两行,第一行有两个数n,m(0<n,m<1000000),第二行包含n个各不相同,且都处于区间[-500000,500000]的整数。
Output
对每组测试数据按从大到小的顺序输出前m大的数。
Sample Input
5 3 3 -35 92 213 -644
Sample Output
213 92 3
Hint
请用VC/VC++提交
解题思路:按照题目要求我们可以想到用hash函数来解决这个问题。但要注意的是题目输入的数范围是[-500000,500000],而下标的取值是不能为负数的,因此需要将输入的数加500000让它变成非负数,最后输出减500000即可。
注释:int s[N];
hash函数即是将输入数x作为下标s[x]并令它为真,由于下标是已经排好顺序的,所以直接判断s[i]为真输出就行。
#include<stdio.h>
void main()
{
int i,n,m,x;
int s[1000001] = {0};
while(scanf("%d%d",&n,&m) != EOF)
{
while(n--)
{
scanf("%d",&x);
s[x+500000] = 1;
}
for(i = 1000000;i >= 0 && m > 0;i--)
{
if(s[i] == 1)
{
printf("%d",i - 500000);
if(m != 1)
{
printf(" ");
}
m--;
}
}
printf("\n");
}
}