题目大意:
给你n个整数,请按从大到小的顺序输出其中前m大的数。
其中n和m都是位于[-500000,500000]。
你说sort 嗯,速度太慢!
是的,水题。
sort可以直接过。但是时间不忍直视!500+MS
那么用hash做呗。因为数范围有限且唯一,直接开个bool的数组就好了。
值得一提的是我看别人的代码里面的输入,用自己写的函数,从300+MS到156MS ,当输入大的时候果然输入会成为瓶颈。
编程之美中也有类似这样的问题,使用维护极小堆来做的,维护元素个数为m个的堆,堆顶为最小的,当新的数大于堆顶就把原来堆顶替换掉,并且维护堆。
sort版本
#include#include 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 HASH+加速输入,HDU排名11.。。
#include#include #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 =-mod && cnt <= m;i--) { if(a[i]!=0) { if(cnt==1) printf(%d,i-mod); else printf( %d,i-mod); cnt++; } } printf( ); } return 0; }