LW给的题解我看不懂我太菜了,干脆自己写一篇。

首先,车油门是要踩到底的的,但有一个限制:某些路段因为限速相当低,以至于当你以某个速度进入上个路段时,即使全程都在降速,仍然无法降到合法的速度。

这实际上是对进入一个路段的初速度的限制。

我们可以定义 vbivb_i 表示进入第 ii 个路段,使以后的路段都合法的 最大速度 。然后我们从后往前扫一遍,更新即可。

处理出 $$vb_i$$ 后,我们就能模拟了!对于每条路段,具体分三种情况:

1.1. 速度先上升、后下降,中间最大速度为该路段的限速。

2.2. 速度先上升、后下降,中间最大速度小于该路段的限速。

3.3. 速度一直上升或下降,直到驶过整条路段。

恭喜你你已经A掉了这道在比赛中无人做对的神仙题 咳咳,细节和公式还是很多的,自己看代码吧。

code:code:

#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;
}

ps:ps:牢魏我想你了你快秽土转生吧

pss:pss:呕吼?我布置的居然有人过了!惠子书你能在这条题解下回复一下我吗?(╹▽╹)

0 条评论

目前还没有评论...