您的位置:首页 > 其它

HDU 1425 sort hash+加速输入

2013-12-27 17:46 351 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: