1408C Discrete Acceleration(思维+二分)

在这里插入图片描述
题目:两辆汽车相隔l 米 相对而行,这段距离内有着n面旗帜,汽车每路过一面旗帜,速度+ 1,
a[n]代表第n面旗帜的位置,求它们相遇的时间

思路:双指针法,当**(x指针下一个旗帜位置-x指针当前位置)/x指针当前速度 + 总时间** 大于 y指针的同法时,说明y指针可以更快到达下一个加速点,所以先计算y指针的总时间与速度。到达最后一个点的时候,可能会出现,其中一个指针已经走了一段时间的路程的情况,所以要特别处理一下

for _ in range(int(input())):
    n, le = map(int, input().split())
    a = [0]+[*map(int, input().split())]+[le]
    s = [y-x for x,y in zip(a[:-1], a[1:])] #差值
    l,r = 0, n
    tl, tr = 0,0
    while r - l > 0:
        ttl = s[l] / (l + 1) #到达下一个加速点所需时间
        ttr = s[r] / (n - r + 1)
        if tl + ttl > tr + ttr: #左指针总时间 大于右指针总时间
            tr += ttr  #右指针加上当前路段所需时间
            r -= 1
        else:
            tl += ttl  
            l += 1
    fsl , fsr = l + 1, n - r + 1   #最终速度
    if tl > tr:						#最后一个点的处理
        fsl, fsr = fsr, fsl 
        tl, tr = tr, tl
    print(tr + ((s[r] - (tr - tl)*fsl) / (fsl+fsr)))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值