您的位置:首页 > 其它

极多数据的输出前k(k<10)大值——swust oj福布斯排行榜(0273)

2016-02-14 19:03 447 查看




本题解题用m,n代替n,k。

看到这个题,想个思路吧,全部排序取前k个输出不就行了,然而这样大的运算量,运行起来是相当费力的,当数据达到10^6内存就不够了,运行时间也相当长了。当然不实用。

排序过程再改改,先排前n个,再把后面的放进去比较大小,看插入进哪里。提交的时候还是显示memory limit exceed,内存占用过大了。

下面是代码及参考他人代码优化的解析:

#include<stdio.h>//0273
struct candidate
{
float pro;
char name[65];
};
struct candidate ca[1000010],temp;//结构体太大只能放在外面,然而占内存太大的问题免不了,于是改为一个一个输入,进行判断,可能符合条件的才留下。
int main()
{
int m,n,i,j,t,k,cou=0;
while(scanf("%d %d",&m,&n)!=EOF)
{
if(cou!=0)
printf("\n");
cou++;
for(i=0;i<m;i++)//输入
{
scanf("%s %f",ca[i].name,&ca[i].pro);
}
for(i=0;i<n-1;i++)//排序前n
{
t=i;
for(j=i+1;j<n;j++)//比起单独给前n个数排序,不如一视同仁,要比较一起比较,最初的值赋为-1就很纯洁了
{
if(ca[t].pro<ca[j].pro)t=j;
}
temp=ca[i];ca[i]=ca[t];ca[t]=temp;
}
for(i=n;i<m;i++)//插入后面足够大的数
{
t=-1;
for(j=n-1;j>=0;j--)//原本想的比较一下得出新值应该插入到哪里,再把比它小的值往后面顺移,减少运算量。但是题中要求要选出的前k个,k是很小的数,并不怕。而且如果用j=0;j<n;j++,步骤还会少些。所以改成从大到小依次判断交换。
{
if(ca[i].pro>ca[j].pro)t=j;
}
if(t!=-1)
{
for(k=n-1;k>t;k--)ca[k]=ca[k-1];
ca[t]=ca[i];
}
}
for(i=0;i<n;i++)//输出
{
printf("%s %g\n",ca[i].name,ca[i].pro);
}
}
return 0;
}


修改版:

#include<stdio.h>//0273,shuru,paixu--n,charu
struct candidate
{
float pro;
char name[65];
};
int main()
{
int m,n,i,j,cou=0;//cou~counter
struct candidate ca[11],temp,x;
while(scanf("%d %d",&m,&n)!=EOF)
{
if(cou)printf("\n");
cou++;
for(i=0;i<n;i++)
{
ca[i].pro=-1;
}
for(i=0;i<m;i++)
{
scanf("%s %f",x.name,&x.pro);
for(j=0;j<n;j++)
{
if(x.pro>ca[j].pro)
{
temp=ca[j];
ca[j]=x;
x=temp;
}
}
}
for(i=0;i<n;i++)
{
printf("%s %g\n",ca[i].name,ca[i].pro);
}
}
return 0;
}


written by Sneexy
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: