HDU1425_sort

题目大意:

给你 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;
}

伟大的梦想成就伟大的人,从细节做好,从点点滴滴做好,从认真做好。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值