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);
}
复制代码

 

posted @   千载煜  阅读(269)  评论(0编辑  收藏  举报
编辑推荐:
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
阅读排行:
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
· 程序员常用高效实用工具推荐,办公效率提升利器!
· Janus Pro:DeepSeek 开源革新,多模态 AI 的未来
· 【译】WinForms:分析一下(我用 Visual Basic 写的)
点击右上角即可分享
微信分享提示