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
原创粉丝点击