| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 582 人关注过本帖
标题:过河问题,新人求解
取消只看楼主 加入收藏
wang20142052
Rank: 1
等 级:新手上路
帖 子:10
专家分:6
注 册:2015-9-8
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:1 
过河问题,新人求解
N个人,只有一条船,每个人都有一个划船速度,要求让N个人过河,一次渡河包括两个人先过去,一个人再回来。每次时间取两个人之间用时最多的,一个人的时候的时间就是他自己所用的。求让N个人过完河所用的最短时间。
先把每个人的所需时间从小到大排序,先考虑简单的情况,一个人,自己过去就可以了。两个人,取时间最长的那个,三个人,最优的是三个人所用时间之和(每让最快的那个单独划船回来)。
四个人或四个以上,就要考虑不同的决策把最慢和次慢的人渡河。有两种决策。
1.始终让最快的单独划船。  最快的和最慢的一起渡河,然后最快的划回来,最快和次慢的一起渡河,最快的再回来。
2.让最快和次快的先过河,最快的划回来,接着最慢和次慢的过河,让次快的划回来。
两种决策中取时间最短的。
Sample Input
4
1 2 5 10
Sample Output
17
这是我的代码,总有两个测试用例过不去,求大神指点
#include <stdio.h>
#include <math.h>
int main()
{
    int a[100000];
    int i,j,t,N,m,n,t1,t2,k;
    scanf ("%d",&N);
    for (i=0;i<N;i++)
    scanf ("%d",&a[i]);
    for (i=0;i<N;i++)
       for (j=0;j<N-i-1;j++)
       {
             if (a[j]>a[j+1])
             {
                 t=a[j];
                 a[j]=a[j+1];
                 a[j+1]=t;
             }
       }
     if (N>=4)
     {
         m=0;
        n=0;
        k=N%2;
        for (j=0;j<(N/2);){
         n=a[0]+a[1]+a[N-1-j]+a[1]+n;
         j=j+2;}
        if (k==0)  t2=n+a[1];
        else  t2=n+a[0]+a[1]+a[2];
         for (i=0;i<=(N/2);i++)
          m=a[0]+a[N-i-1]+m;
        if (k==0)  t1=m-a[0];
        else  t1=m+a[1];
        if (t1>t2)
        printf ("%d\n",t2);
        else
        printf ("%d\n",t1);
     }      
     else
     {
         if (N==1)
         printf ("%d\n",a[0]);
         if (N==2)
         printf ("%d\n",a[1]);
         if (N==3)
         printf ("%d\n",a[0]+a[1]+a[2]);
     }
}
2015-09-15 18:14
wang20142052
Rank: 1
等 级:新手上路
帖 子:10
专家分:6
注 册:2015-9-8
收藏
得分:0 
回复 2楼 lowrie
多谢指点

黑白线
2015-09-18 18:42
快速回复:过河问题,新人求解
数据加载中...
 
   



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

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