HDU1425_sort
来源:互联网 发布:修真的电脑程序员txt 编辑:程序博客网 时间:2024/06/08 19:54
题目大意:
给你 n 个整数,按顺序输出其中前 m 大的数。
题目测试数据与数据范围:
5 33 -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;}
伟大的梦想成就伟大的人,从细节做好,从点点滴滴做好,从认真做好。
0 0