D - 小车问题(二分)

甲、乙两人同时从 A 地出发要尽快同时赶到 B 地。出发时 A 地有一辆小车,可是这辆小车除了驾驶员外只能带一人。已知甲、乙两人的步行速度一样,且小于车的速度。问:怎样利用小车才能使两人尽快同时到达。

输入格式

仅一行,三个整数,分别表示 A、B 两地的距离s (1≤s≤2000) 米,人的步行速度 a 米/秒,车的速度 b米/秒,a<b<2000。

输出格式

两人同时到达 B 地需要的最短时间,单位秒,保留 2 位小数。

Sample Input

120  5  25

Sample Output

9.60

解题思路:

法一:(数学分析)

因为甲乙到终点的时间相同并且要求最短,则二人走和坐车的时间相等,即走和坐车的路程相同,并且车只回去接一次。

|--x----|----s-2*x-----|---x----|

设人走的路程为x,时间为t1,坐车路程为s-x,时间为t2,车回去接人的时间为t3,总共耗时为t。

人走的时间=车回去接另一个人的时间+另一个人坐车的时间。即t1=t2+t3,即x/a=(s-2*x)/b+(s-x)/b,得x=2*a*s/(3*a+b),时间为x/a+(s-x)/b。

法二:二分

t1为车载甲到甲下车的时间,t2为车返回去接乙的时间,t1+t2时间内乙一直在步行

m(甲用的时间),n(乙用的时间)

m<n的话,不公平啦~,说明甲坐车的时间长(快),mid(甲下车的地方)应该小一点,故r=mid

反之,l=mid;直到r-l小于某一误差值。

代码:

#include <iostream>
#include <bits/stdc++.h>
using namespace std;
#define ll long long
   double s,a,b;
bool check(double mid)
{
    double t1=mid/b;
    double t2=(mid-t1*a)/(a+b);
    double m=t1+(s-mid)/a;
    double n=t1+t2+(s-(t1+t2)*a)/b;
    return m<n;
}
int main()
{

   cin>>s>>a>>b;
   double l=0,r=s;
   while (r-l>1e-8)
   {
       double mid=(l+r)/2.0;
       if (check(mid)) r=mid;
       else l=mid;
   }
   printf ("%.2f",l/b+(s-l)/a);
    return 0;
}

这位博主写的更加清晰易懂~是一只派大鑫

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值