所有题解都在注释里面。
1004:
1 /* 2 出题人的说法:最终通过停车线的时候,一定是一个车后面堵着剩余所有车。那么影响 3 时间的就只有最前面这辆车,所以对于每一辆车,假设是它与0车堵在一起的最靠前的一辆车。 4 那么可以计算出一个值。所有的车的计算值的最大值就是答案。 5 这个就是出题人的说法 ,时间复杂度是o(n) 6 7 我个人的理解:我们做这道题得注意到一个条件,就是对当前的车,先不要考虑后面的车。 8 只考虑它与前面的那一辆车的互相作用。考虑他们什么时候撞倒。 9 首先假设第一辆车能直接不碰到其他车,就以最高速度到达。那么显然时间是s[1]/v[1] 10 如果它比(s[2]+l[2])/v[2]的时间要长,那么我们显然就是不会碰到第二辆。 11 但是如果要断,显然会碰到,就这样处理出被那辆车给堵住,这样就可以处理出一个最大值。 12 通过最大值,就是答案 13 复杂度:o(n) 14 15 出题人有个堆的做法是nlogn 也是只考虑第i辆车与第i+1辆车的互相作用时间。 16 17 二分的想法其实和o(n)的想法差不多。 18 19 这道题的核心想点就是不要去处理这么多关系,否则会让你思绪不清。你就缕清前一辆车和后一辆车的关系就可以了。 20 然后从第一辆车没被堵住开始处理,处理被第二辆堵住,被第三辆堵住,以此类推。。。。。。。。。。 21 22 */ 23 #include<bits/stdc++.h> 24 typedef long long ll; 25 using namespace std; 26 const int maxn=101000; 27 int n; 28 ll si[maxn],vi[maxn],li[maxn]; 29 int main(){ 30 while(scanf("%d",&n)!=EOF){ 31 for(int i=1;i<=n+1;i++) scanf("%lld",&li[i]); 32 for(int i=1;i<=n+1;i++) scanf("%lld",&si[i]); 33 for(int i=1;i<=n+1;i++) scanf("%lld",&vi[i]); 34 double ans=0.0; 35 double f=0; 36 for(int i=1;i<=n+1;i++){ 37 if(i!=1) f+=li[i]; 38 ans=max(ans,(f+si[i])/(vi[i]*1.00)); 39 } 40 printf("%.10lf\n",ans); 41 } 42 return 0; 43 }
原文地址:https://www.cnblogs.com/pandaking/p/11250065.html
时间: 2024-10-07 14:00:16