回 帖 发 新 帖 刷新版面

主题:小车问题 C语言

【问题描述】 
    甲,乙两人要同时从A地出发要尽快同时赶到B地。出发时A地有一辆小车,可是这辆小车除了驾驶员外只能带一人。已知甲,乙两人的步行速度一样,且小于车的速度。问:怎样利用小车才能使两人尽快同时到达。
【输入】
    仅一行,三个数据分别表示AB两地的距离s,人步行的速度a,车的速度b。
【输出】
    两人同时到达B地需要的最短时间。
【样例】
    car.in
    120  5  25
    
    car.out
    9.6000000000E+00
【算法提示】
    甲先乘车到达K处后下车步行,小车再回头接已走到C处的乙,在D处相遇后,乙再乘车赶往B地,最后甲,乙一起到达B地。这样问题就转换成了求K处的位置,我们用二分法,不断尝试,知道满足同时到达的时间精度。算法框架如下:
     (1)输入s,a,b;
     (2)c0=0;c1=s;c=(c0+c1)/2;
     (3)求t1,t2;
     (4)如果t1<t2,那么c=(c0+c)/2
                  否则c=(c+c1)/2;
     反复执行(3)和(4),直到abs(t1-t2)满足精度要求(即小于误差标准)。



大家帮忙把这个问题用C语言实现吧,我是一个编程菜鸟,做不出来,万分感谢啊。

回复列表 (共1个回复)

沙发

//dis:2地距离
//v_a:人走路的速度
//v_b:汽车速度
//必须:v_b >=v_a

float func(float dis,float v_a,float v_b)
{    
     float t1,t2;
     float c0=0,c1=dis;
     float k=(c0+c1)/2;//一开始就选2者中心距离。 
      
     for(;;){

       t1=k/v_b+                                            //甲开始走路时间 
          (k-k*v_a/v_b)/(v_a+v_b)+                          //和汽车相遇所需时间 
          (dis-(k/v_b+ (k-k*v_a/v_b)/(v_a+v_b))*v_a)/v_b;   //坐汽车走所需时间                     
       t2=k/v_b+(dis-k)/v_a;                                //乙,先汽车后走路 

 
       
       if(fabs(t1-t2)<0.00001)
       {
             printf("K:%f,t1:%f,t2:%f",k,t1,t2);   
             break;
       }else{           
              if(t1<t2)
              {
                    c0=k;
                   (k=(c1+k)/2);
              }else{
                     c1=k;
                    (k=(k+c0)/2);                    
              }      
       }
     }
     
     return k;
}

我来回复

您尚未登录,请登录后再回复。点此登录或注册