儿童节校内测T1 逃亡
【题目描述】逃亡(escape.cpp/c/pas)
邪狼紧张地说:“老大,警察快追过来了,我们快逃跑吧!”
修罗王傲然道:“在我的字典里没有逃跑……”
邪狼内心崇敬地想:“老大实在是太有领袖范了……”
修罗王接着说:“只有战略转移。”
邪狼:“……”
现在,修罗王和邪狼两人需要从A地出发尽快到达B地。出发时A地有一辆可带一人的自动驾驶悬浮车。又知两人步行速度相同。问怎样利用小车才能使两人尽快同时到达B地。
【输入格式】
输入文件为escape.in,有三个int类型整数,分别表示A、B两地的距离,步行速度和车速。
【输出格式】
输出文件为escape.out,有一个小数位数为2的浮点数,即最短时间。
【输入样例】
100 5 10
【输出样例】
14.00
QAQ
这是6月1号校内分治测的T1
这题就这点格局?
很明显我们要用二分查找
这应该是一道暴力模拟题
让我们先分析一下这道题
应该是典型的同时到达问题(小学奥数杀我
众所周知小学奥数题应该都有固定解法
于是我上网搜严谨地推导了一下
解出了这道题的公式
那我们再来推导一遍
(有人刚刚提到二分了吗(大雾
由题意可知
开局会给出三个已知量
分别是路程s,步行速度a和汽车速度b
你们这些虐暴小学奥数的巨佬们应该都已经想到了
应该是先用车把一个人(姑且叫他甲吧)从出发点带到路程中的某一点
同时另一个人(那就叫他乙)向着终点步行
然后把甲放下来步行
悬浮车调头回去接乙
接上乙之后再调头向终点前进
最后甲乙二人同时到达终点
(没理解,难道我说的不是很明白了!?,那可能我说的不够明白,希望宁可以悟一悟)
反正这题最关键的除了内俩人就是中间的这个折返点(姑且叫做Q叭)
把这条路程看成数轴
两人出发的点A设为原点
设甲到Q前的用时为t1
Q到终点的用时为t2
则将t2作为定量列方程有
(s-q)/a=2*(2*q/(a+b)-q/b)+(s-q)/b=t2
(s-q)/a很好理解,就是甲下车后步行的路程除以步行的速度
我们再来分析这个式子
2*(2*q/(a+b)-q/b)+(s-q)/b
后一项(s-1)/b表示的是乙从Q到终点所花的时间
乙在Q点到终点的这一段距离是已经坐着车的了
2*(2*q/(a+b)-q/b)则表示悬浮车从Q点调头以后与乙汇合的时间再加上从汇合以后重新回到Q的时间
于是可以解得关于点Q在数轴上的坐标
q=(b+a)*s/(b+3a)
现在已经知道了Q的坐标
则以甲为参照
Q之前的时间为(q/b)
Q之后的时间为(s-q)/a
相加即为所求(甲乙同时到达,所以可以只求一个,显然甲更好求)
AC代码如下
1 #include<iostream> 2 #include<cstdio> 3 int main() 4 { 5 long long s,a,b; 6 double q; 7 scanf("%d%d%d",&s,&a,&b); 8 q=(b+a)*s/(b+3*a); 9 printf("%.2lf\n",q/b+(s-q)/a); 10 return 0; 11 } 12 //是不是很短QwQ
话说这题也可以用分治
而且我谷好像也有原题来着
P1258 小车问题
https://www.luogu.com.cn/problem/P1258
不过它的位数是6位
和分治的差距会比较大
所以不推荐使用数学方法求解...
END