- 题解
壮壮上学
- @ 2025-5-12 19:31:53
LW给的题解我看不懂我太菜了,干脆自己写一篇。
首先,车油门是要踩到底的的,但有一个限制:某些路段因为限速相当低,以至于当你以某个速度进入上个路段时,即使全程都在降速,仍然无法降到合法的速度。
这实际上是对进入一个路段的初速度的限制。
我们可以定义 表示进入第 个路段,使以后的路段都合法的 最大速度 。然后我们从后往前扫一遍,更新即可。
处理出 $$vb_i$$ 后,我们就能模拟了!对于每条路段,具体分三种情况:
速度先上升、后下降,中间最大速度为该路段的限速。
速度先上升、后下降,中间最大速度小于该路段的限速。
速度一直上升或下降,直到驶过整条路段。
恭喜你你已经A掉了这道在比赛中无人做对的神仙题
咳咳,细节和公式还是很多的,自己看代码吧。
#include<bits/stdc++.h>
#define pw(a) a*a
using namespace std;
const int N=200;
int n;
double v,v2,ans,ve2,a2,way1,way2,s2,l;
double w[N],s[N],a[N],vb[N];
int main(){
freopen("school.in","r",stdin);
freopen("school.out","w",stdout);
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%lf%lf%lf",&w[i],&s[i],&a[i]);
vb[i]=min(s[i-1],s[i]);
}
vb[n+1]=s[n];
for(int i=n;i>=1;i--)
if(vb[i]>vb[i+1])
vb[i]=min(vb[i], sqrt( pw(vb[i+1])+2*a[i]*w[i] ) );
for(int i=1;i<=n;i++){
lans=ans;
v2=v*v;
a2=a[i]*2;
s2=s[i]*s[i];
ve2=vb[i+1]*vb[i+1];
way1=(2*s2-v2-ve2)/a2;
way2=(v2-ve2)/a2;
way2= (way2<0)?-1*way2:way2;
if(way2<0) cout<<1145;
if(w[i]>=way1){
ans+=(s[i]*2-v-vb[i+1])/a[i]+(w[i]-way1)/s[i];
v=vb[i+1];
}
else if(w[i]>way2){
double mid=sqrt( (a2*w[i]+v2+ve2)/2 );
ans=(2*mid-v-vb[i+1])/a[i];
v=vb[i+1];
}
else{
l=v;
if(v<vb[i+1])
v=sqrt( v2+a2*w[i] ),ans+=(v-l)/a[i];
else v=sqrt( v2-a2*w[i] ),ans+=(l-v)/a[i];
}
}
printf("%0.2f",ans);
return 0;
}
牢魏我想你了你快秽土转生吧
呕吼?我布置的题居然有人过了!惠子书你能在这条题解下回复一下我吗?(╹▽╹)
0 条评论
目前还没有评论...
京公网安备 11011102002149号