P1258小车问题

传送

   很多人质疑它是二分,但其实它就是二分(我会说我不会解方程吗)

   据说有很多人没看懂题干在说些什么,那就不要管题干了。拿样例算一遍,我们看看样例的答案是怎么算出来的。

        这是样例。看到这个数,我们很懵逼。众所周知,坐车比走路快。那么让谁先坐车,坐到哪,就是个问题。因为甲,乙两人要同时到终点,所以肯定不能坐车坐到终点。那么不妨假设让一个人坐车坐到一半(既然是假设,就随便蒙就好了),设这个过程为<1>,然后车再回去接第二个人,设这个过程为<2>,再追赶第一个人,这个过程为<3>。

     设第一个人所处的位置为a1,第二个人所处的位置为a2。那么<1>是一个很一般的计算,a1=(s+a2)/2,   所用时间t=(a2-a1)/b,   ans先加上t,记得用double类型。<2>是相遇问题,此时t=(a1-a2)/(b+a)(人也在走路),ans加上t  ,a2+=a*t<3>是追击问题,t=(a1-a2)/(b-a) ,ans+=t,a2=a1(此时第二个人追上第一个人)。之后第一个人再坐车走。这就构成了循环。既然题目给出了精度为小数点后6位,那就循环直到 s-a1<0.000001,这样这个题就做完了,虽然代码会比解方程要长,但是思路好想。废话不多说,上代码

    

#include<iostream>
#include<cstdio>
using namespace std;
double s,a,b;
double t,ans;
double a1,a2;
void xc()
{
    a2=(s+a1)/2;
    t=1.0*(a2-a1)/b;
    a1+=1.0*a*t;ans+=t;
    t=1.0*(a2-a1)/(b+a);
    a2+=1.0*a*t;a1+=1.0*a*t;ans+=t;
    t=1.0*(a2-a1)/(b-a);a2+=1.0*a*t;a1=a2;ans+=t;
    //莫名其妙的把代码打成了三角...
}
int main()
{
    cin>>s>>a>>b;
    while(s-a1>0.000001)
    {  
       xc();
      
    }
    ans=ans+(s-a1)/a*1.0;
    printf("%.6lf",ans);
}
原文地址:https://www.cnblogs.com/lcez56jsy/p/10628454.html