您的位置:首页 > 其它

HDU1425_sort

2014-07-22 21:15 113 查看
题目大意:

给你 n 个整数,按顺序输出其中前 m 大的数。

题目测试数据与数据范围:

5 3
3 -35 92 213 -644


213 92 3


其中 0<n,m<1000000, n 个数也各不相同,且都处于区间 [-500000,500000]

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1425

题目分折:

要知道给出的数的范围是 (0,1000000),对于一般的排序算法的复杂度是 n*logn.那么这么大的数是否会超时,我想会,再看到区间的范围是[-500000,500000],且都不相同,那么我们是否可以开一个 hash[1000010] 的数组,对于任何一个输入的 X,令hash[X+500000] = 1,待输入完成之后,从后往前遍历这个数组,如果对于第 i 个数有标记为1,hash[i] == 1,输出 i-500000。前 m 个即可。

小乐一下:

这道题是较为简单的 hash 运用,是时间复杂度最低的一种技术,时间复杂度可以降低为 n .但一般都得自己找一个好的哈希函数,而且存在冲突问题。当然对于字符串用哈希技术有一个叫做 ELF 的东西,有兴趣的可以查一下相关资料,而对于上面这道题目,如果 n 个数之间存在相同的,把标记改为 ++ ,输出的时候 --即可。

代码秀一下,更好更简洁的由你们来实现,不要直接复制。

#include<stdio.h>
#include<string.h>

int hash[1000010];

int main(){
int a;
int n,m;
while(scanf("%d%d",&n,&m)!=EOF){
memset(hash,0,sizeof(hash));
for(int i = 0;i<n;i++){
scanf("%d",&a);
hash[a+500000] = 1;
}
int first = 1;
for(int i = 1000010;i>=0;i--){
if(hash[i]) {
if(first) {printf("%d",i-500000);first=0;}
else printf(" %d",i-500000);
m--;
if(m==0) break;
}
}
printf("\n");
}
return 0;
}


伟大的梦想成就伟大的人,从细节做好,从点点滴滴做好,从认真做好。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: