您的位置:首页 > 编程语言 > C语言/C++

HDU 1425 sort

2017-05-18 11:13 330 查看
[align=left]Problem Description[/align]
给你n个整数,请按从大到小的顺序输出其中前m大的数。

 

[align=left]Input[/align]
每组测试数据有两行,第一行有两个数n,m(0<n,m<1000000),第二行包含n个各不相同,且都处于区间[-500000,500000]的整数。

 

[align=left]Output[/align]
对每组测试数据按从大到小的顺序输出前m大的数。

 

[align=left]Sample Input[/align]

5 3
3 -35 92 213 -644

 

[align=left]Sample Output[/align]

213 92 3

Hint请用VC/VC++提交

 

[align=left]Author[/align]
LL
 

[align=left]Source[/align]
ACM暑期集训队练习赛(三)

 

[align=left]Recommend[/align]
linle
~~~~~~~~~~~~~~~~~~~~~~~~~~~~

基数排序~

其实sort就能过,只是想写一下基数排序罢了~

然后,刚开始用基数排序,桶排序和快排都T了……因为用了读入优化……什么情况?

基数排序:

#include<cstdio>

int n,m,jin,x,a[1000001],b[1000001],c[10][1000001],q[1000001],kkz;

int main()
{
while(~scanf("%d%d",&n,&m))
{
jin=1;a[0]=b[0]=q[0]=0;
for(int i=1;i<=n;i++)
{
scanf("%d",&x);
if(x<0) b[++b[0]]=-x;
else a[++a[0]]=x;
}

for(int i=1;i<=a[0];i++) q[++q[0]]=a[i];
for(int i=1;i<=6;i++)
{
for(int j=0;j<10;j++) c[j][0]=0;
for(int j=1;j<=q[0];j++)
{
int now=(q[j]%(jin*10))/jin;
c[now][++c[now][0]]=q[j];
}
q[0]=0;jin*=10;
for(int j=0;j<=9;j++)
for(int k=1;k<=c[j][0];k++) q[++q[0]]=c[j][k];
}
printf("%d",q[q[0]]);kkz=q[0];
for(int i=2;i<=m && i<=q[0];i++) printf(" %d",q[q[0]-i+1]);
if(q[0]>=m)
{
puts("");continue;
}

m-=q[0];q[0]=0;jin=1;
for(int i=1;i<=b[0];i++) q[++q[0]]=b[i];
for(int i=1;i<=6;i++)
{
for(int j=0;j<10;j++) c[j][0]=0;
for(int j=1;j<=q[0];j++)
{
int now=(q[j]%(jin*10))/jin;
c[now][++c[now][0]]=q[j];
}
q[0]=0;jin*=10;
for(int j=0;j<=9;j++)
for(int k=1;k<=c[j][0];k++) q[++q[0]]=c[j][k];
}
if(kkz) printf(" ");printf("%d",-q[1]);
for(int i=2;i<=m;i++) printf(" %d",-q[i]);
puts("");
}
return 0;
}

桶排序:

#include<cstdio>
#include<cstring>
#define d(u) u+500000

int n,m,a[1000001],tot,x,num;

int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
tot=num=0;
memset(a,0,sizeof(a));
for(int i=1;i<=n;i++) scanf("%d",&x),a[d(x)]++;
for(int i=500000;i>=-500000 && m;i--)
if(a[d(i)]) while(a[d(i)] && m)
{
if(!num) printf("%d",i),m--,a[d(i)]--,num++;
else printf(" %d",i),m--,a[d(i)]--;
}
puts("");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++ 基数排序 桶排序