HDU 1425 sort hash+加速输入

http://acm.hdu.edu.cn/showproblem.php?pid=1425

题目大意:

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

其中n和m都是位于[-500000,500000]。

你说sort?嗯,速度太慢!



是的,水题。

sort可以直接过。但是时间不忍直视!500+MS

那么用hash做呗。因为数范围有限且唯一,直接开个bool的数组就好了。

值得一提的是我看别人的代码里面的输入,用自己写的函数,从300+MS到156MS ,当输入大的时候果然输入会成为瓶颈。

编程之美中也有类似这样的问题,使用维护极小堆来做的,维护元素个数为m个的堆,堆顶为最小的,当新的数大于堆顶就把原来堆顶替换掉,并且维护堆。


sort版本

#include<cstdio>
#include<algorithm>
using namespace std;
const int MAXN=1000000+10;
int a[MAXN];
int main()
{
    int n,m;
    while(~scanf("%d%d",&n,&m))
    {
        int i;
        for(i=0;i<n;i++)
            scanf("%d",&a[i]);

        sort(a,a+n);
        int cnt=1;
        for(i=n-1;cnt<m;cnt++,i--)
            printf("%d ",a[i]);
        printf("%d\n",a[i]);
        
    }

    return 0;
}

HASH+加速输入,HDU排名11.。。

#include<cstdio>
#include<cstring>
#define  isdigit(c) ((c>='0' && c<='9')) 
const int MAXN=(500000<<1)+10;
const int mod=500000;
bool a[MAXN];
inline void myscanf(int &num)  //加速输入
{  
    char c=getchar();
    while(!isdigit(c) && c!='-')
        c=getchar();

    bool neg=false;
    if(c=='-')
    {      neg=true;    num=0; }
    else
        num=c-'0';

    while(c=getchar() , isdigit(c) )
    {
        num*=10;
        num+=c-'0';
    }
    if(neg==true)
        num=-num;

}  
int main()
{
    int n,m;
    while(~scanf("%d%d",&n,&m))
    {
        memset(a,0,sizeof(a));
        int temp,i;
        for(i=0;i<n;i++)    
        {
             myscanf(temp);
            a[temp + mod ] =1;

        }

        int cnt=1;
        for(int i=mod<<1;i>=-mod && cnt <= m;i--)
        {
            if(a[i]!=0)
            {
                if(cnt==1)
                    printf("%d",i-mod);
                else
                    printf(" %d",i-mod);
                cnt++;                
            }

        }
        printf("\n");
    }

    return 0;    
}



posted @ 2013-12-27 17:46  hr_whisper  阅读(166)  评论(0编辑  收藏  举报