Live2D
博客园 首页 私信博主 显示目录 隐藏目录 管理 动画

P1258 小车问题

题目描述

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

输入输出格式

输入格式:

仅一行,三个数据分别表示AB两地的距离s,人的步行速度a,车的速度b。

输出格式:

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

输入输出样例

输入样例#1:
120 5 25
输出样例#1:
9.600000
----------------------------------------------------------------------------------------------------
思路:二分答案
首先要找到需要二分的变量:
  小车先把甲运到某一个位置C(0<C<s),然后小车返回去找乙,期间甲乙都继续向前走,当小车接到乙后,以b的速度赶往B点。甲全程用的时间为t1,乙为t2。
那么C就是我们需要二分的变量。
因为t1与t2都往相等无限逼近,所以二分的临界条件便是abs(t1-t2)小于某个精度,这里设为0.0000001。
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
double s,a,b,l,r;
long long read()
{
    long long x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    return x*f; 
}
inline double work1(double mid)
{
    double ans=0;
    ans+=mid/b;
    ans+=(s-mid)/a;
    return ans;
}
inline double work2(double mid)
{
    double ans=0;
    ans+=mid/b;
    ans+=(mid-(mid/b)*a)/(a+b);
    ans+=(s-((mid-(mid/b)*a)/(a+b)*a+((mid/b)*a)))/b;
    return ans;
}
inline bool check(double x,double y)
{
    return x>y;
}
int main()
{
    s=read();a=read();b=read();
    l=1;r=s;
    while(l<=r)
    {
        double t1=0,t2=0;
        double mid=(l+r)/2;
        t1=work1(mid);t2=work2(mid);
        if(check(t1,t2)) l=mid;
        else r=mid;
        if(abs(t1-t2)<0.0000001)
        {
            printf("%.6f",t1);
            return 0;
        }
    }
}

复杂度:(logn*log1000000)

posted @ 2019-01-17 20:52  _hhs  阅读(518)  评论(0编辑  收藏  举报