• FJUT16级第一周寒假作业题解D题


    题目链接:http://210.34.193.66:8080/vj/Contest.jsp?cid=160#P3

    第八集,体能训练

    TimeLimit:1000MS  MemoryLimit:128MB
    64-bit integer IO format:%I64d
    Problem Description

    小A和小C跋山涉水,终于来到了特工们要聚集的城市,他们俩在附近找了家宾馆住下。这时,距离特工们聚会的时间越来越近了,是时候来一波体能训练,以防遇到危险,跑得太慢了,被抓住了,就GG了…

    于是,A和小C一起来到了宾馆附近的体育馆的环形操场上跑步,起先,他们两个人约定,一开始他们两个人从同一点,反方向跑步,每次两个人面对面相遇的话,第k次相遇则需要休息k,然后再各自往反方向按照原本的速度继续跑步。现在,告诉你操场长度是L,小A和小C的跑步速度分别是VaVc 。这时候,问题来了,询问你经过k秒,输出他们相遇的次数、

    由于两个人的体力有限,他们两个人约定相遇10000次就不跑了

    Input

    有多组测试案例,

    每组测试案例,第一行输入三个正整数,L,Va和Vc(1<=Va,Vc<=10,1<=L<=1000)。

    第二行输入一个Q(Q<=10000),表示询问的次数。

    接下来有Q行,每一行输入一个正整数k(1<=k=10^9),表示询问经过k秒后,他们相遇了多少次、

    Output

    对于每次询问的时间,输出他们相遇的次数、

    SampleInput
    2 1 1
    8
    0
    1
    3
    10
    20
    21
    5000000
    511768840
    
    
    SampleOutput
    0
    1
    2
    4
    5
    6
    3161
    10000


    思路:首先,这是一个二分题,他们每跑一圈的时间是L/(va+vc),每次休息的时间会随着相遇的次数增加,随着相遇次数增加消耗的时间是个等差数列。
    这样我们可以得出第n次相遇的时候用的时间为:n*L/(va+vc)+(n+1)*n/2-n,这里最后的-n是因为第n次相遇的时候,他们还没有第n次休息,所以要把前面等差数列求和公式里的多算的一次n减去。
    这里n是个二次函数,通过对这个方程分析,我们可以知道这里一定是取右边的解,这里有两种解法。
    1、二分法求解:
    也没什么要注意的,找到对应的方程后就是很明显也很常规的二分题,计算时候要注意转换成浮点运算。
    2、解方程求解:
    特别丑的解方程出来的结果附上:
    ans=1/2.0-l*1.0/(va+vc*1.0)+sqrt((l*1.0/(va+vc*1.0)-1/2.0)*(l*1.0/(va+vc*1.0)-1/2.0)+2*k)

    因为浮点数运算可能会有运算误差,比如6/3有可能会出现1.999999999的情况,所以需要加一个很小的数来补误差,我输出答案的时候是加了0.000001的。
  • 相关阅读:
    【每天一道PAT】1001 A+B Format
    C++ STL总结
    开篇
    happen-before原则
    java多线程的状态转换以及基本操作
    集合初始容量
    fail-fast机制
    Stack
    Iterator
    Vector
  • 原文地址:https://www.cnblogs.com/xseventh/p/6263586.html
Copyright © 2020-2023  润新知