zoukankan      html  css  js  c++  java
  • 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);
    }
  • 相关阅读:
    LeetCode506-相对名次
    LeetCode496-下一个更大的元素(遍历)
    Redis查询超时问题排查及原因分析
    SQL Server 输出消息
    SQL Server按时间分段统计数据
    C# 数据保存到Excel
    查看SQL Server数据库恢复进度
    输入百度网址地址后面有tn小尾巴解决办法
    SQL Server 查询数据大小
    Sping Boot + Spring Security + Mybaits + Logback +JWT验证 项目开发框架搭建
  • 原文地址:https://www.cnblogs.com/lcez56jsy/p/10628454.html
Copyright © 2011-2022 走看看