zoukankan      html  css  js  c++  java
  • 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的。
  • 相关阅读:
    164 Maximum Gap 最大间距
    162 Find Peak Element 寻找峰值
    160 Intersection of Two Linked Lists 相交链表
    155 Min Stack 最小栈
    154 Find Minimum in Rotated Sorted Array II
    153 Find Minimum in Rotated Sorted Array 旋转数组的最小值
    152 Maximum Product Subarray 乘积最大子序列
    151 Reverse Words in a String 翻转字符串里的单词
    bzoj3994: [SDOI2015]约数个数和
    bzoj 4590: [Shoi2015]自动刷题机
  • 原文地址:https://www.cnblogs.com/xseventh/p/6263586.html
Copyright © 2011-2022 走看看