2019 Multi-University Training Contest 1
题目
[6581] 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;
}