HDU-6581 Vacation(思维题)2019暑假杭电多校第一场

题意:汤姆和杰瑞要去度假。他们现在在一条单行道上行驶,前面有几辆车。更具体地说,他们前面有n辆车。第i辆车的长度为l[i],车头距停车线为s[i],最大速度为v[i]。汤姆和杰瑞驾驶的车的长度为l[0],距停车线为s[0],最大速度为v[0]。然而,由于道路太窄,没有一辆车能比其他车领先。即使你的速度比前面的车快,你仍然只能以和前面的车一样的速度行驶。但如果不受前方车辆的影响,驾驶员将以最大速度行驶。你可以假设这里的每一个司机都非常擅长驾驶,这样相邻车辆的距离就可以保持为0。
汤姆和杰瑞想知道通过停车线所需的最短时间。我们说,一旦车头经过停车线,一辆车就通过了。
请注意,即使汽车经过停车线,它仍然在路上行驶,不能超车。

思路:最后那辆车要么是以自己为头通过要么是跟在很长的车队的后面通过。所有答案可以枚举每辆车作为那个车队的车头的情况然后取最大值。以后对于这种知道答案必定是出自某个集合的题目一定要考虑这种思路!!!

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e5 + 5;
struct node
{
    double l, s, v;
} car[maxn];
double sum[maxn];
int main()
{
//    freopen("in.txt", "r", stdin);
    int n;while(~scanf("%d", &n))
    {
        sum[0] = 0;
        for(int i = 0; i <= n; i++)
        {
            scanf("%lf", &car[i].l);
            if(i) sum[i] = sum[i - 1] + car[i].l;
        }
        for(int i = 0; i <= n; i++) scanf("%lf", &car[i].s);
        for(int i = 0; i <= n; i++) scanf("%lf", &car[i].v);
        double ans = -1;
        for(int i = 0; i <= n; i++)
        {
            double t = ((sum[i] + car[i].s) / car[i].v);
            ans = max(ans, t);
        }
        printf("%.10lf\n", ans);
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值