趣味程序设计_过桥问题(C语言)


题目描述:

过桥问题。有N(N≥2)个人在晚上需要从X地到达Y地,中间要过一座桥,过桥需要手电筒(而他们只有1个手电筒),每次最多两个人一起过桥(否则桥会垮)。N个人的过桥时间依次存入数组t[N]中,分别为:t[0],
t[1], ……, t[N-1]。过桥的速度以慢的人为准!注意:手电筒不能丢过桥!问题是:编程求这N个人过桥所花的最短时间。



输入:

有多组测试数据,

每组数据先输入一个人数N,然后输入这N个人过桥所花的时间。



输出:

输出对应的最短时间。



样例输入 :

4 1 2 5 10
4 5 2 10 1



样例输出:

17
17



源代码:

#include <stdio.h>
#include <stdlib.h>
void paixun(int time[],int N);//冒泡排序对时间排序
int guoqiao(int time[],int N);//当2*T次快>=T最快+T次慢时,T最慢+T最快+T次慢+T最快//当2*Tck<Tzk+Tcm时,Tck+Tzk+Tzm+Tck
int main()
{
    int N;
    int time[100];
    int zong;//总时间
    while(scanf("%d",&N)!=EOF)
    {
        for(int i=0; i<N; i++)
        {
            scanf("%d",&time[i]);
        }
        paixun(time,N);
        if(N==1) printf("%d\n",time[0]);
        if(N==2)
        {
            printf("%d\n",time[1]);
        }
        else if(N==3)
        {
            printf("%d\n",time[0]+time[1]+time[2]);

        }
        else if(N>=4)
        {
            zong=guoqiao(time,N);
            printf("%d\n",zong);
        }
    }
    return 0;
}
void paixun(int time[],int N)
{
    int i,j;
    int temp;
    for(i=1; i<N; i++)
    {
        for(j=0; j<N-i; j++)
        {
            if(time[j]>time[j+1])
            {
                temp=time[j];
                time[j]=time[j+1];
                time[j+1]=temp;
            }
        }
    }

}
int guoqiao(int time[],int N)
{
    int sum=0;//总时间
    if(N==1)
    {
        sum=time[0];
        return sum;
    }
    if(N==2)
    {
        sum=time[1];
        return sum;
    }
    if(N==3)
    {
        sum=time[0]+time[1]+time[2];
        return sum;
    }
    if(2*time[1]>=time[0]+time[N])
    {
        sum=sum+time[N-1]+time[0]*2+time[N-2]+guoqiao(time,N-2);
    }
    else
    {
        sum=sum+time[1]+time[0]+time[N-1]+time[1]+guoqiao(time,N-2);
    }
    return sum;
}


解题思路:

  1.   如果N=1、2,所有人直接过桥。
    
  2.   如果N=3,由最快的人往返一次把其他两人送过河(本次过去3个人)。
    
  3.   如果N≥4,设ZKer、CKer为走得最快和次快的旅行者,过桥所需时间分别为Tzk、Tck;而ZMer、CMer为走得最慢和次慢的旅行者,过桥所需时间分别为Tzm、Tcm。那么
    

a) 当2Tck>=Tzk+Tcm时,使用模式一将ZMer和CMer送过桥;(模式一:ZKer、ZMer过去,ZKer返回送手电,再ZKer、CMer过去,ZKer返回送手电,即总是由最快的把2个最慢的送过桥。本模式实际将2个最慢的人送过桥,用时Tzm+Tzk+Tcm+Tzk);
b) 当2
Tck<Tzk+Tcm时,使用模式二将ZMer和CMer送过桥;(模式二:ZKer、CKer过去,ZKer返回送手电,再ZMer、CMer过去,CKer返回送手电。本模式实际将2个最慢的人送过桥,用时Tck+Tzk+Tzm+Tck)。
算法步骤:
1)从键盘输入一个数赋值给N表示为N个人;
2)再从键盘输入这些人过桥所需时间;
3)对N个人所需时间进行排序;
4)如果只有两个人则输入时间较长的那个时间;
5)如果有三人则输出三人时间和;
6)如果大于等于4人用递归函数求出时间并输出时间;



遇到的问题:

递归条件没注意数组从0开始;
解决办法:N-1;


  • 1
    点赞
  • 6
    收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:数字20 设计师:CSDN官方博客 返回首页
评论

打赏作者

沐林天释

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值