codeforces 5d 模拟

一道物理题

题意:开车从A行驶到C,途中经过B,AB长为d,AC长为l。初始速度为0,加速度为a,最大速度v_m,经过B时速度不能超过v_b。问从A到C最少需要多少秒?

题解:

显然,分类讨论即可

先根据v_b和v_m划分

然后再根据一直加速到达B点能否到达v_b划分

走法是很确定的——一直维持可允许的最高速行驶

#include <bits/stdc++.h>
using namespace std;

const int eps = 1e-8;

bool equal(double a, double b){
	a-= b;
	if(a < 0)
		a = -a;
	return a < eps;
}
double find_time2(double w, double x, double a, double v){
	double x2 = (v * v - w * w) / (2 * a);
	if(x2 <= x){
		double t1 = (x - x2) / v;
		return (v - w) / a + t1;
	}
	double maxv = sqrt(2 * a * x + w * w);
	return (maxv - w) / a;
}
double a, v, l, d, w;
 
int main(){
	while(~ scanf("%lf %lf %lf %lf %lf", &a, &v, &l, &d, &w)){
		double t = sqrt((2.0 * d) / a);
		double V = a * t;
		V = min(v, V);	//到d点最大速度
		if(V <= w){
			printf("%.10lf\n", find_time2(0, l, a, v));
			continue;
		}
		double x1 = v * v / (2 * a);
		double x2 = (v * v - w * w) / (2 * a);
		if(x1 + x2 <= d){
			double t3 = (d - x1 - x2) / v;
			printf("%.10lf\n", v / a + (v - w) / a + t3 + find_time2(w, l - d, a, v));
			continue;
		}
		double v1 = sqrt(a * d + w * w / 2);
		double t1 = v1 / a, t2 = (v1 - w) / a;
		printf("%.10lf\n", t1 + t2 + find_time2(w, l - d, a, v));
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_38759433/article/details/86512812
今日推荐