| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3123 人关注过本帖, 2 人收藏
标题:任意输入一组数列,求出不相邻的两个数和的最大值。新手第高手帮一下
只看楼主 加入收藏
m564522634
Rank: 2
等 级:论坛游民
帖 子:34
专家分:16
注 册:2010-9-1
结帖率:60%
收藏(2)
已结贴  问题点数:10 回复次数:18 
任意输入一组数列,求出不相邻的两个数和的最大值。新手第高手帮一下
任意输入一组数列,求出不相邻的两个数和的最大值。新手第高手帮一下
搜索更多相关主题的帖子: 输入 相邻 最大值 
2010-09-08 22:44
A13433758072
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:广东潮州
等 级:小飞侠
威 望:1
帖 子:1182
专家分:2784
注 册:2010-7-22
收藏
得分:0 
...............................你真厉害.............这么经典啊    !!!!!!

一步一个脚印...............................默默地前进.....
诚邀乐于解答c菜鸟问题,的热心网友加入,  QQ群38490319
2010-09-08 22:57
御坂美琴
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:魔術の禁書目錄
等 级:小飞侠
威 望:9
帖 子:952
专家分:2929
注 册:2010-8-18
收藏
得分:0 
找出前三大,如果有并列第三大的,那就和没有并列第三大分两种大情况,然后这个题目就能解决了

永远为正义而奋斗,锄强扶弱的Level 5 超能力者
とある魔術の禁書目錄インデックス__御み坂さか美み琴こと
http://bbs.bccn.net/space.php?action=threads&uid=483997
2010-09-08 23:05
m564522634
Rank: 2
等 级:论坛游民
帖 子:34
专家分:16
注 册:2010-9-1
收藏
得分:0 
回复 3楼 御坂美琴
是不是先用冒泡法找出最大的三个数呀
2010-09-08 23:15
jack10141
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:陕西西安
等 级:小飞侠
威 望:6
帖 子:706
专家分:2271
注 册:2010-8-10
收藏
得分:0 
这个问题无需找前三大吧??这个问题是跟找最大值有些类似的问题啊!!
---------------------------------------------------------
解题思路:
假设输入的一组数列存放于数组a中,共n个数
最大值max初始为a[0]+a[2]
用个二层循环:
for(i=0;i<n-2;i++)
    for(j=i+2;j<n;j++)
        if(max<a[i]+a[j])max=a[i]+a[j];
则题目要求的最大值就有了啊!      


[ 本帖最后由 jack10141 于 2010-9-9 00:07 编辑 ]
收到的鲜花
  • 遮天云2010-09-09 12:54 送鲜花  4朵   附言:妙

Coding就像一盒巧克力,你永远不会知道你会遇到什么BUG
别跟我说你是不能的,这让我愤怒,因为这侮辱了你的智慧
2010-09-08 23:57
真我
Rank: 4
等 级:业余侠客
威 望:1
帖 子:146
专家分:210
注 册:2010-7-14
收藏
得分:0 
楼上的就是高
2010-09-09 00:17
御坂美琴
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:魔術の禁書目錄
等 级:小飞侠
威 望:9
帖 子:952
专家分:2929
注 册:2010-8-18
收藏
得分:0 
以下是引用jack10141在2010-9-8 23:57:25的发言:

这个问题无需找前三大吧??这个问题是跟找最大值有些类似的问题啊!!
---------------------------------------------------------
解题思路:
假设输入的一组数列存放于数组a中,共n个数
最大值max初始为a[0]+a[2]
用个二层循环:
for(i=0;i<n-2;i++)
    for(j=i+2;j<n;j++)
        if(max<a+a[j])max=a+a[j];
则题目要求的最大值就有了啊!      


这个和找前三大的办法的区别是,时间级别上差了一个n
楼主没有说这个n最大多大,那么如果n有10000个,那这个时间差就很巨大了

永远为正义而奋斗,锄强扶弱的Level 5 超能力者
とある魔術の禁書目錄インデックス__御み坂さか美み琴こと
http://bbs.bccn.net/space.php?action=threads&uid=483997
2010-09-09 00:23
gongyaping
Rank: 4
来 自:广东肇庆怀集
等 级:业余侠客
帖 子:174
专家分:257
注 册:2010-8-1
收藏
得分:0 
回帖得分顺便学习下,新手。
2010-09-09 16:37
jack10141
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:陕西西安
等 级:小飞侠
威 望:6
帖 子:706
专家分:2271
注 册:2010-8-10
收藏
得分:0 
以下是引用御坂美琴在2010-9-9 00:23:46的发言:

 
 
这个和找前三大的办法的区别是,时间级别上差了一个n
楼主没有说这个n最大多大,那么如果n有10000个,那这个时间差就很巨大了
不是吧?我还真没有没有考虑过运行时间复杂度的问题。。。
但是要找前三大,你用什么办法找呢??可否给个代码或者详细解题办法大家参考下??

[ 本帖最后由 jack10141 于 2010-9-9 18:27 编辑 ]

Coding就像一盒巧克力,你永远不会知道你会遇到什么BUG
别跟我说你是不能的,这让我愤怒,因为这侮辱了你的智慧
2010-09-09 18:23
liqinm
Rank: 2
等 级:论坛游民
帖 子:13
专家分:39
注 册:2010-8-31
收藏
得分:10 
说到只要知道前几大的数,我写了个代码:
#include <stdio.h>

typedef struct mlist
{
    int n;
    int flag;
}mlist;

int cnt_ml;
mlist ml[20];

void ml_push(int n)
{
    ml[cnt_ml].n = n;
    ml[cnt_ml].flag = 0;
    cnt_ml++;
    while (cnt_ml > 10)
    {
        int nmin = -1, n;
        for (n=0; n<cnt_ml; n++)
        {
            if (ml[n].flag==0 && (nmin == -1 || ml[n].n<ml[nmin].n))
            {
                nmin = n;
            }
        }
        ml[n=nmin].flag = 1;
        while (nmin>0 && ml[nmin-1].flag)
        {
            nmin--;
        }
        while (n<cnt_ml && ml[n].flag)
        {
            n++;
        }
        if(nmin)++nmin;
        for (; n<cnt_ml; ++n, ++nmin)
        {
            ml[nmin] = ml[n];
        }
        cnt_ml = nmin;
    }
}

int main()
{
    int n;
    while (scanf("%d", &n)!=EOF)
    {
        int s, t=0;
        cnt_ml = 0;
        for (; t<n; ++t)
        {
            scanf("%d", &s);
            ml_push(s);
        }
        for (t=0; t<cnt_ml; ++t)
        {
            if (ml[t].flag)
            {
                printf("_ ");
            }
            else
            {
                printf("%d ", ml[t].n);
            }
        }
        puts("");
    }
    return 0;
}
例如,输入:
20
1 23 4 56 7 8 9 10 24 31 2 35 2 33 46 24 41 21 22 1

第一个数表示下一行要输入20个数,
然后程序会输出
56 _ 35 _ 33 46 _ 41 _
下横线表示中间有一串数字忽略掉
这样,就会保留下最大的五个数,并且复杂度是线性的,所用的内存空间也很小,只开了个20的数组
之后再套用那个二重循环的代码,就能以非常快的速度算出答案了
不过不知道这个代码是不是一定对的,但我觉得只要留下前五大就足够了,甚至可能只需要前四大的数,不知道有没有反例呢
收到的鲜花
  • 赵本山2010-09-12 16:20 送鲜花  5朵   附言:厉害

my name is liqin
2010-09-09 19:19
快速回复:任意输入一组数列,求出不相邻的两个数和的最大值。新手第高手帮一下
数据加载中...
 
   



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

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