| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1395 人关注过本帖
标题:杭电1425,谁优化下,老师超时
只看楼主 加入收藏
Buger
Rank: 1
等 级:新手上路
帖 子:60
专家分:7
注 册:2013-3-20
结帖率:84.62%
收藏
已结贴  问题点数:20 回复次数:13 
杭电1425,谁优化下,老师超时
程序代码:
sort
Time Limit: 6000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 20158    Accepted Submission(s): 5964

Problem Description
给你n个整数,请按从大到小的顺序输出其中前m大的数。


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


Output
对每组测试数据按从大到小的顺序输出前m大的数。


Sample Input
5 3
3 -35 92 213 -644


Sample Output
213 92 3
HintHint
请用VC/VC++提交
一下是我的代码
#include <stdio.h>
int a[1000000];
int main() {
    int n, m, i, j, t, prime;
    while(scanf("%d%d", &n, &m) == 2) {
        prime = 1;
        for(i = 0; i < n; i++) scanf("%d", &a[i]);
        for(i = 0; i < n - 1; i++)
            for(j = 0; j < n - 1 - i; j++)
                if(a[j] < a[j + 1]) {
                    t = a[j + 1];
                    a[j + 1] = a[j];
                    a[j] = t;
                }
        for(i = 0; i < m; i++) {
            if(prime) prime = 0;
            else if(prime == 0) printf(" ");
            printf("%d", a[i]);
        }
        printf("\n");
    }
    return 0;
}
地址http://acm.hdu.
搜索更多相关主题的帖子: 老师 Java 
2013-03-31 04:09
不要脸的猫
Rank: 3Rank: 3
等 级:论坛游侠
威 望:2
帖 子:41
专家分:126
注 册:2012-6-20
收藏
得分:1 
#include <stdio.h>
int a[1000000];
int main()
{
    int n, m, i,j,k;
    while(scanf("%d%d", &n,&m) == 2)
    {
        for(i = 1; i < n+1; i++)
        {
            k=0;
            scanf("%d", &a[0]);
            for(j=1;j<i;j++)
                if(a[j]<a[0])
                {
                    k=j;
                    break;
                }
            for(j=i-1;k&&j>=k;j--)
                a[j+1]=a[j];
            if(k)
                a[k]=a[0];
            else
                a[i]=a[0];
        }
        for(i=0;i<m;i++)
            printf("%d ",a[i+1]);
        printf("\n");
    }
    return 0;
}

埋骨何须桑梓地,人生无处不青山
2013-03-31 11:02
Buger
Rank: 1
等 级:新手上路
帖 子:60
专家分:7
注 册:2013-3-20
收藏
得分:0 
我不知道你有没有提交过,还是超时....麻烦下次,确定了之后再回帖是一样的....不好意思,如果冒犯请见谅.....
2013-03-31 11:14
peach5460
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:武汉
等 级:贵宾
威 望:30
帖 子:2780
专家分:6060
注 册:2008-1-28
收藏
得分:0 
以下是引用Buger在2013-3-31 11:14:36的发言:

我不知道你有没有提交过,还是超时....麻烦下次,确定了之后再回帖是一样的....不好意思,如果冒犯请见谅.....

你好傲娇哟

我总觉得授人以鱼不如授人以渔...
可是总有些SB叫嚣着:要么给代码给答案,要么滚蛋...
虽然我知道不要跟SB一般见识,但是我真的没修炼到宠辱不惊...
2013-03-31 11:24
Buger
Rank: 1
等 级:新手上路
帖 子:60
专家分:7
注 册:2013-3-20
收藏
得分:0 
呵呵,希望楼上能见谅,没什么别的意思....
还望peach5460帮我看看咋超时了...谢谢...
2013-03-31 11:37
罗庇鹏ksq
Rank: 5Rank: 5
来 自:太平洋
等 级:职业侠客
帖 子:220
专家分:310
注 册:2012-6-30
收藏
得分:0 
好骄傲!!!

从来都是无所谓,现在也该学着有所谓。✿咱们一个人,别坐井观天❀
2013-03-31 11:59
Buger
Rank: 1
等 级:新手上路
帖 子:60
专家分:7
注 册:2013-3-20
收藏
得分:0 
好吧,我说错话了...
2013-03-31 12:01
peach5460
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:武汉
等 级:贵宾
威 望:30
帖 子:2780
专家分:6060
注 册:2008-1-28
收藏
得分:1 
以下是引用Buger在2013-3-31 11:37:06的发言:

呵呵,希望楼上能见谅,没什么别的意思....
还望peach5460帮我看看咋超时了...谢谢...

1,你的算法基础很差,现在去玩ACM为时尚早...
说句不好听的话,你根本不懂算法...现在去钻那个牛角尖,我个人认为误入歧途

2,这题我中午做饭的时候想了一下,暂时没想到解决方案

3,如果你只是想要个答案,去问谷歌

我总觉得授人以鱼不如授人以渔...
可是总有些SB叫嚣着:要么给代码给答案,要么滚蛋...
虽然我知道不要跟SB一般见识,但是我真的没修炼到宠辱不惊...
2013-03-31 12:51
liao06550107
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:2
帖 子:111
专家分:696
注 册:2011-10-2
收藏
得分:3 
回复 楼主 Buger
用选择排序或堆排序设计思想,会快点!

听不同的音乐,看不同的书,游历不同的城市,邂逅不同的人,走的多了,站的高了,自然就看的远了。
2013-03-31 17:25
fanpengpeng
Rank: 8Rank: 8
来 自:南极洲
等 级:蝙蝠侠
威 望:7
帖 子:299
专家分:849
注 册:2013-2-1
收藏
得分:10 
这个题目估计只有高级排序算法才不会超时 我试了快速排序和堆排序两种 都能通过
不过题目中只要求输出前m项 因此不需要全排 用堆排序可以做到只排出前m项 而快速排序的话 需要全排
下面是只排出前m项的堆排序算法 性能还算可以的 至少在他们提交的结果中来看 343ms算是比较好的
代码你参考一下
程序代码:
#include <stdio.h>

#define MAX_SIZE 1000000

void HeapAdj(int *list, int beg, int end);

int list[MAX_SIZE+1];
    
int main()
{
    int n, m, i, tmp;        

    while(scanf("%d %d", &n, &m) != EOF){
        for(i=1; i<=n; i++)
            scanf("%d", list+i);
        
        for(i=n/2; i>1; i--)
            HeapAdj(list, i, n);    
        for(i=0; i<m; i++){
            HeapAdj(list, 1, n-i);
            
            tmp = list[1];
            list[1] = list[n-i];
            list[n-i] = tmp;    
        }
        
        for(i=0; i<m-1; i++)
            printf("%d ", list[n-i]);
        printf("%d\n", list[n-i]);                       
       }
   
       return 0;
}

void HeapAdj(int *list, int beg, int end)
{
    int i, tmp=list[beg];
    
    for(i=beg*2; i<=end; i*=2){
        if(i<end && list[i+1]>list[i]) i++;
        if(tmp > list[i]) break;
        list[beg] = list[i];
        beg = i;
    }
    list[beg] = tmp;
}


人生是一场错过 愿你别蹉跎
2013-04-01 02:04
快速回复:杭电1425,谁优化下,老师超时
数据加载中...
 
   



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

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