极多数据的输出前k(k


本题解题用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






发布了48 篇原创文章 · 获赞 21 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/qq_33810513/article/details/50663752
k