• 16级第一周寒假作业D题


    第八集,体能训练

    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),然后随着相遇次数增多,休息时间也会增多,这其实就是一个等差数列,以1为首项,1为公差的等差数列。以此类推我们就可以得出第N次相遇所需的时间为(N*L)/(va+vc)+N*(N+1)/2.0-N,
    因为N次相遇的时候,他们还没有休息,所以在式子的最后要减一个N。因为题目所需的时间为1000MS,如果我们用for循环一次一次的去试,肯定会超时,所以我们就需要用到二分。
    这时候就比较简单了,这时候就要注意一点也就是要转化为浮点运算,鉴于个人因为没有转化为浮点运算,WA了好几次233.转化为浮点运算,然后跟K比较大小就可以了
    int find()
    {
        int l=0,r=10010;
        int mid;
        while(l<r)
        {
            mid=(l+r)/2;
            if((1.0*mid*L)/(va+vc)+mid*(mid+1)/2.0-mid>k)  //第N次相遇的时间与题目所要求的的K进行比较
                r=mid;
            else
                l=mid+1;
        }
        return r;
    }
    本人AC的内存与时间以及代码长度:1856KB,528MS,359


  • 相关阅读:
    弧长的参方程表示形式
    selenium实例
    中英文混合分词
    准确率(Precision)、召回率(Recall)以及F值(F-Measure)
    安装zeromq以及zeromq的python示例
    uwsgi安装过程中遇到的问题
    安装python-devel 在升级到python2.7之后
    更新yum源
    yum mysql on centos 7
    vue--子组件主动获取父组件的数据和方法
  • 原文地址:https://www.cnblogs.com/tijie/p/6322274.html
Copyright © 2020-2023  润新知