【洛谷p1258】小车问题
(……吓人,心有余悸)
洛谷算法标签::
(行吧它居然是个二分【解方程的我抖抖发瑟】)
作为一个写了一页演草纸才解出来的方程,显然我要好好写一写(希望不会半途而废)
- 思路:
先把其中一个人(甲)用车送到某个地方(暂且称那时的时间为t吧),然后车返回去接另一个人(乙),然后车载着乙到达终点(可怜的甲在线走路)。
- 实现:
设总路程为s,放下甲去接乙的时间为t,车的速度为b,人的速度为a,最短时间为x。那么首先得到两个式纸:
bt+a(x-t)=s; ①
at+a(bt-at)/(b+a)+b(x-t-(bt-at)/(b+a))=s; ②(其中表示在小车返回途中乙走的路程,表示小车接到乙后的时间,表示小车载着乙走的路程)
解第一个方程,可以得到:x=(s-bt+at)/a;③
联立①②,可以解得:bt(2+(b-a)/(b+a))-at(2+(b-a)/(b+a))=(b-a)x;
令p=2+(b-a)/(b+a);则btp-atp=(b-a)x
解得x=tp;④
联立③④,得到:t=s/(pa+b-a);
将t值再代回④中,得到x的值。
- 代码:
#include<iostream> #include<cstdio> #include<algorithm> #include<string> #include<cstdlib> using namespace std; double s,a,b,t,x,p,q; int main() { scanf("%lf%lf%lf",&s,&a,&b); p=(3*b+a)/(a+b);q=p;//相当于p=2+(b-a)/(b+a)【我化辽一下简 p*=a; p=p+b-a; s/=p;//这里把s当作辽t,以上三步都在计算t=s/(pa+b-a); x=s*q;//相当于x=t*p(因为p值改变辽所以令p=q) printf("%.6lf",x); return 0; }
end-(纪念第一次认真写博)