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; }
新 blog : www.hrwhisper.me