2019 Multi-University Training Contest 1 题解

2019 Multi-University Training Contest 1

题目

[6581] Vacation

思路

如果你的车要到达停车线,那么前面一辆车的车尾至少要越过停车线,此时前一辆车对你就没有任何影响了(因为题中说了只要车头越过停车线便算通过),以此类推当所有车辆到达如下位置时,便可当成最终状态。
当车辆超过此位置时对结果没有任何影响,当车辆未达到此位置时那最后一辆车(也就是你)便无法到达停车线。
Vacation
对于任意的第 i 辆车,假设它到达正确位置的时间为ti,那么对于第 i+1 辆车越过停车线的时间 ti+1 有两种可能:
· 所需走的总路程/车速
· 前一辆车到达正确位置的时间 ti
当ti>ti+1时,也就是说后面的车可以比前面的车先到达。这是不可能发生的。所以ti+1=ti
当ti<=ti+1时,就是后面的车不早于前面的车到达,那么ti+1便取决于自身所用的时间 (总路程/自身车速)
即ti+1=max(ti,s/v)
因此所有车到达最终状态所需的时间为最大的 ti =tmax
比较你的车到达停车线的时间和 tmax便是最终答案

一开始还将所有的车辆按开始位置排了序,后来测试发现题目中给的数据是有序的,,,,

此题数据输入较多,使用cin可能会超时,建议scanf

代码
#define Author JokerNoCry
#define Date 2020/05/16
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
struct car
{
    int l,s,v;
    int sum=0;
    double t;
}c[100100];
bool cmp(car a,car b)
{
    return a.s>b.s;
}
double max(double a,double b)
{
    return a>b?a:b;
}
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        for(int i=0;i<=n;i++) scanf("%d",&c[i].l);
        for(int i=0;i<=n;i++) scanf("%d",&c[i].s);
        for(int i=0;i<=n;i++) scanf("%d",&c[i].v);
        //sort(c+1,c+n+1,cmp);
        c[0].sum=0;
        for(int i=1;i<=n;i++)
        {
            c[i].sum=c[i-1].sum+c[i].l;
            c[i].t=1.0*(c[i].sum+c[i].s)/c[i].v;
        }
        c[0].t=1.0*c[0].s/c[0].v;
        double res=c[0].t;
        for(int i=n;i>0;i--)
        {
            res=max(res,c[i].t);
        }
        printf("%lf\n",res);
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值