| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 746 人关注过本帖
标题:棘手的福布斯富豪排榜
只看楼主 加入收藏
蓝桥
Rank: 2
等 级:论坛游民
帖 子:18
专家分:22
注 册:2014-2-26
结帖率:100%
收藏
已结贴  问题点数:19 回复次数:7 
棘手的福布斯富豪排榜

Description1917年创立的福布斯杂志,在编制各种排行榜方面有86年历史,1982年首次推出富豪榜在全球产生空前影响,现在,一年一度的福布斯全球亿万富翁榜在全世界受到密切关注。福布斯每年编制一百多个有关人物、公司和生活时尚排行榜,在全球范围内,福布斯富豪榜的江湖地位毋庸置疑。他云集了世界各地的富豪们。

Input有多组测试数据,少于10。 每组数据两个数N (0 < N < = 10^6)和K ( 0< K <= 10 ,K < N ),表示有N位候选人,要从中选出排名前K的富豪,然后是N位候选人的名字和财产(亿元)。 (名字是由不超过60个字母组成的字符串 ,任意两个人的财产都不一样)

Output输出排名前K的富豪的名字和财产,按财产从大到小排序(每组数据后面输出一个空行)。


Sample Input

5 3
fdsa 100.5
aaaa 132
jkoret 421.1
koerwrew 543
jirjge 432.4
4 2
Fda 441.6
Fdsja 123
afds 345.11
Haffe 894


Sample Output

koerwrew 543
jirjge 432.4
jkoret 421.1

Haffe 894
Fda 441.6

Hinttoshio友情提示:


 注意格式,多组输入,每组输出完了下面有一个空行,但是最后一组输出完后后面没有空行.
 由于判断最后一组不方便,可以改成第一组测试数据直接输出,除了第一组测试数据以外在输出前都先输出一个空行.


 怎么判断第几组?!计数器会用吗?


SourceAconly
__________________________________________________________________
[ Submit ]                    [ Status ] [ Discuss ]


 
 
 
这是我的代码,为什么 Memory Limit Exceeded,急求
#include<stdio.h>
#include<stdlib.h>

struct richer
{
    float capital;//资金
    char name[60];
};

main()
{
    int k,flag=0;//k为前k名的富豪
    long i,j,num;//num为富豪数量
    struct richer *p,temp;

    while(scanf("%ld%d",&num,&k)!=EOF)
    {
        if(flag<=10)
        {   
            getchar();
            p=(struct richer *)malloc(num*sizeof(struct richer));
   
            for(i=0;i<num;i++)
            {
                scanf("%s%f",(p+i)->name,&(p+i)->capital);
            }

            if(flag!=0)
                printf("\n");

            for(i=0;;i++)
            {
                for(j=i+1;j<num;j++)
                {
                    if(p[j].capital>p[i].capital)
                    {
                        temp=p[i];
                        p[i]=p[j];
                        p[j]=temp;
                    }
                }
                printf("%s %g\n",p[i].name,p[i].capital);
                k--;
                if(k==0)
                    break;
            }
            flag++;
        }
    }
    return 0;
}
搜索更多相关主题的帖子: 福布斯 生活时尚 排行榜 全世界 候选人 
2014-03-07 00:35
pangshch
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:2
帖 子:443
专家分:1966
注 册:2013-4-9
收藏
得分:5 
你没注意 (0< K <= 10 ,K < N)这个条件. 不用保存所有的数据, 只要保存 K 组数据就可以了.最多10组数据和最多10^6组数据所要的内存当然不一样.....
2014-03-07 08:20
蓝桥
Rank: 2
等 级:论坛游民
帖 子:18
专家分:22
注 册:2014-2-26
收藏
得分:0 
感谢楼上的发言,我再想想
2014-03-07 08:23
蓝桥
Rank: 2
等 级:论坛游民
帖 子:18
专家分:22
注 册:2014-2-26
收藏
得分:0 
2楼的话挺有道理的,不过如果不先开辟空间储存全部输入的数据,那么后边如何比较呢?想不明白,麻烦2楼指教
2014-03-07 08:32
pangshch
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:2
帖 子:443
专家分:1966
注 册:2013-4-9
收藏
得分:10 
以下是引用蓝桥在2014-3-7 08:32:53的发言:

2楼的话挺有道理的,不过如果不先开辟空间储存全部输入的数据,那么后边如何比较呢?想不明白,麻烦2楼指教
先开辟K个空间, 保存K个数据, 然后:
, 把这K个从大到小排序, 再读取下一个和最后一个比较, 小于就丢弃, 大于就把最后一个挤出去,把这个数放到合适的位置.再读下一个数.
最后输出,
这样,只保存前K个数据, 其它的都丢弃了.
2014-03-07 09:18
蓝桥
Rank: 2
等 级:论坛游民
帖 子:18
专家分:22
注 册:2014-2-26
收藏
得分:0 
#include<stdio.h>
#include<stdlib.h>

struct richer
{
    float capital;//资金
    char name[61];//字符数组name的大小应大于60
};

void sort(struct richer *,int);

main()
{
    int k,flag=0;
    long i,num;
    struct richer *p;

    while(scanf("%ld%d",&num,&k)!=EOF)
    {
        if(flag<10)
        {   
            getchar();
            p=(struct richer *)malloc((k+1)*sizeof(struct richer));
   
            for(i=0;i<k;i++)
            {
                scanf("%s%f",(p+i)->name,&(p+i)->capital);
            }

            sort(p,k);

            for(i=k;i<num;i++)
            {
                scanf("%s%f",(p+k)->name,&(p+k)->capital);
            
                if(p[k].capital>p[k-1].capital)
                {
                    p[k-1]=p[k];
                    sort(p,k);   
                }
            }

            if(flag!=0)
                printf("\n");

            for(i=0;i<k;i++)
            {
                printf("%s %g\n",p[i].name,p[i].capital);
            }
            flag++;
        }
    }
    return 0;
}

void sort(struct richer *p,int k)
{
    int i;
    struct richer temp;
    for(;;)
    {
        int flag=0;

        for(i=0;i<k-1;i++)
        {
            if(p[i].capital<p[i+1].capital)
            {
                temp=p[i+1];
                p[i+1]=p[i];
                p[i]=temp;

                flag=1;
            }
        }
        if(flag==0)
            break;
    }
}
这是我改后的代码,AC了(题中的字符数组name的大小应大于60,真坑啊,错了好多次)
虽然AC了,不过还能不能再简化一下呢,,
2014-03-07 17:18
蓝桥
Rank: 2
等 级:论坛游民
帖 子:18
专家分:22
注 册:2014-2-26
收藏
得分:0 
真心感谢2楼的提示,以前没这么做过,长见识了
2014-03-07 17:24
loveClangage
Rank: 8Rank: 8
来 自:广东云浮
等 级:蝙蝠侠
帖 子:326
专家分:891
注 册:2013-8-23
收藏
得分:4 
是蓝桥杯的题目吗。。。

编写的程序,不能改变世界,却可以改变自己...
2014-03-07 18:27
快速回复:棘手的福布斯富豪排榜
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.021082 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved