| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 6645 人关注过本帖
标题:过桥问题..
只看楼主 加入收藏
luchar
Rank: 9Rank: 9Rank: 9
来 自:南京
等 级:蜘蛛侠
帖 子:279
专家分:1263
注 册:2011-11-3
收藏
得分:0 
原来如此啊,现在终于算出来了
当n为偶数时,总时间为
for(i=n-1;i>1;i=i-2)
s=s+a[i];
s=s+(n/2-1)*a[0]+a[1]*(n-1);
当n为奇数时,总时间为
for(i=n-1;i>1;i=i-2)
s=s+a[i];
s=s+a[0]*n/2+a[1]*(n/2+1);
程序代码:
#include<stdio.h>
int main()
{
    int n,a[100]={0},i,s,j,t;
    printf("请输入过桥人数n:");
    scanf("%d",&n);
    if(n!=0)
    {
        s=0;
    printf("请分别输入n个人的过桥所需时间:\n");
        for(i=0;i<n;i++)
        scanf("%d",&a[i]);
        for(i=0;i<n;i++)
        {
            for(j=1+i;j<n;j++)
            if(a[j]<a[i])
            {
                t=a[i];
                a[i]=a[j];
                a[j]=t;
            }
        }
        if(n%2==0) 
        {
            for(i=n-1;i>1;i=i-2)
            s=s+a[i];
            s=s+(n/2-1)*a[0]+a[1]*(n-1);
        }
        else
        {
            for(i=n-1;i>1;i=i-2)
            s=s+a[i];
            s=s+a[0]*n/2+a[1]*(n/2+1);
        }
        printf("共需用时%d分钟。\n",s);    
    }
    else printf("输入错误。\n");
}
2011-11-08 14:27
laoyang103
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:内蒙古包头
等 级:贵宾
威 望:19
帖 子:3082
专家分:11056
注 册:2010-5-22
收藏
得分:0 
回复 8楼 maxam0128
你说的是对的 我想错了

                                         
===========深入<----------------->浅出============
2011-11-08 14:55
wordless
Rank: 1
等 级:新手上路
帖 子:4
专家分:8
注 册:2011-11-7
收藏
得分:0 
拿笔算了好久。。总算知道是怎么回事了
2011-11-08 15:34
maxam0128
Rank: 2
等 级:论坛游民
帖 子:37
专家分:10
注 册:2011-10-9
收藏
得分:0 
回复 12楼 laoyang103
交上去总是超时,我就不知道哪里还有问题...
2011-11-08 20:54
『点点滴滴』
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
帖 子:168
专家分:1035
注 册:2007-7-9
收藏
得分:0 
程序代码:
#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std ;
const int MAX = 1010 ;
int Speed[MAX] ;
int main()
{
    int pnum , last , total = 0 ;
   
    scanf("%d", &pnum );
    last = pnum - 1 ;
    for( int i=0 ; i != pnum ; ++i )
    {
        scanf("%d", &Speed[i] ) ;
    }

    sort( Speed , Speed + pnum ) ;

    if( pnum == 1 ) cout << Speed[0] << endl ;
    else
    {
        while( last>= 2 )
        {
            if( last >= 3 )
            {
                if( Speed[last-1] + Speed[0] > Speed[1] * 2 )
                    total += Speed[last] + Speed[0] + 2 * Speed[1] ;
                else total += Speed[0] * 2 + Speed[last-1] + Speed[last] ;

                last -= 2 ;
            }
            else if( last == 2 )
            {
                total += Speed[0] + Speed[last];
                break ;
            }
        }

        total += Speed[1] ;

        printf("%d\n", total ) ;
    }
    return 0 ;
}        


[ 本帖最后由 『点点滴滴』 于 2011-11-9 10:45 编辑 ]
2011-11-09 09:31
maxam0128
Rank: 2
等 级:论坛游民
帖 子:37
专家分:10
注 册:2011-10-9
收藏
得分:0 
回复 15楼 『点点滴滴』
尴尬,我表示c++没学过..
2011-11-09 10:40
laoyang103
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:内蒙古包头
等 级:贵宾
威 望:19
帖 子:3082
专家分:11056
注 册:2010-5-22
收藏
得分:0 
回复 14楼 maxam0128
题目网址发来

                                         
===========深入<----------------->浅出============
2011-11-09 19:35
『点点滴滴』
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
帖 子:168
专家分:1035
注 册:2007-7-9
收藏
得分:0 
http://acm.
2011-11-09 20:05
chenbinbin21
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2012-3-17
收藏
得分:0 
1.最小的两个过河;
2.最小的回来;
3.最大的两个过河;
4.最小的回来;
5.重复1234;
6.过完结束。
解释一下:我估计这种方法是正确的一种;
也就是说让最小的两个反复带手电筒,
比如:四个人那个过河时间分别为1,2,5,10
1      1,2过去;     2分钟
2      1回来;        1分钟
3      5,10过去;     10分钟
4      2回来;        2分钟
5      1,2过去;   2分钟

            合计:17分钟;
楼上前几个算法不太对,这个也不一定,这是我想出的最快的!其余不解释!
2012-03-17 20:27
vvi
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2012-4-25
收藏
得分:0 
回复 11楼 luchar
测试了一下,还是不对,当4个人过桥:1,6,8,12。如果按照你的程序来算是31秒,但是实际最短时间是28秒
2012-04-25 12:30
快速回复:过桥问题..
数据加载中...
 
   



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

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