很多人质疑它是二分,但其实它就是二分(我会说我不会解方程吗)
据说有很多人没看懂题干在说些什么,那就不要管题干了。拿样例算一遍,我们看看样例的答案是怎么算出来的。
这是样例。看到这个数,我们很懵逼。众所周知,坐车比走路快。那么让谁先坐车,坐到哪,就是个问题。因为甲,乙两人要同时到终点,所以肯定不能坐车坐到终点。那么不妨假设让一个人坐车坐到一半(既然是假设,就随便蒙就好了),设这个过程为<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); }