2018年北京信息科技大学第十届程序设计竞赛暨ACM选拔赛--I郊游(数学题)
题目描述
现已知队员走路的速度为v1,车的速度为v2,每位队员只能上车一次。
你的任务是帮助萌新确定到达目的地所用的时间(保留10位小数,考虑上车下车、车掉头时间不计)
输入描述:
第一行输入一个整数m,代表m组数据。 接下来m行,输入5个正整数n,l,v1,v2,k。 其中1≤m≤1000,1≤n≤10000, 1≤l≤109, 1≤v1<v2≤109, 1≤k≤n
输出描述:
输出一行,为一个实数。代表萌新确定到达目的地所用的时间(保留10位小数,考虑上车下车、车掉头时间不计)
输入
1 3 6 1 2 1
输出
4.7142857143
数学物理不分家~~~啊哈哈哈,我就当他是物理好了
过程有一点麻烦,但是思路理清了的话 , 就很明了啦。
首先,车和人是同时从起点出发的。求最优解的话也就是说求最短时间,车是可以随时放人下车和掉头的。
最后一批人直接坐车到终点,和他们同时到达,因为要保证时间最优。
每个人经过的流程大致是这样的 人走一段距离-->坐上车跑一段距离--->下车走到终点(包括最后坐车的)一起到达。
车不断的来回接人。
由上可以得到两个结论:
1:每一批人走的距离是一样的。2:车载每一批人行驶的距离也是一样的(理由是因为要同时到达)
设一共有p批人
对于第一批人,起点为0的位置,如果他们是在x位置下车的,那么车回头和向前走的人相遇地点在2*v1*x/(v1+v2) (这里读者自己证明),设其为y。
{
会证明的直接略过这里,不会的可以参考一下
t1 = X/v2-----车到X的时间----此时队员走到 X*v1/v2 米
队员向前走与车往回开相遇时花费的时间相同
v1*t +v2*t = X - X*v1/v2--------> t = X(v2-v1)/v2*(v1+v2)
相遇的地点为 X*v1/v2 + v1*X*(v2-v1)/v2*(v1+v2)-----化简----->
y = 2*X*v1/(v1+v2)
}对于第二批人起点在y,根据上面的公式可知车会在2*y的位置和向前走的人相遇。
......
第p批的时候起点在(p-1)*y,因为他们是直接坐车到终点的,坐车距离是x
那么有关系式 L-(p-1)*y=x
化简得x=l*(v1 + v2) / (2.0*v1*(p - 1) + v1 + v2)
结果就为x/v2+(l-x)/v1
下面代码:
#include <stdio.h>
int main()
{
int m, n,l,v1,v2,k,p;
scanf("%d" , &m);
while(m--)
{
scanf("%d %d %d %d %d" , &n , &l , &v1 , &v2 , &k);
if(n%k == 0)
{
p = n/k;
}
else
{
p = n/k+1;
}
double x = (double)l*(v1+v2)/(v1+v2+2*v1*(p-1));
double t = (double)x/v2+(l*1.0-x)/v1;
printf("%.10f\n" , t);
}
return 0;
}
上一篇: The given artifact contains a string literal with a package reference ‘android.support.v4.content‘
下一篇: P1036 选数
推荐阅读
-
北京信息科技大学第十二届程序设计竞赛暨ACM选拔赛题解
-
2018年北京信息科技大学第十届程序设计竞赛暨ACM选拔赛 D 打篮球(java)
-
2018年北京信息科技大学第十届程序设计竞赛暨ACM选拔赛 C 颜料的混合(java)
-
2018年北京信息科技大学第十届程序设计竞赛暨ACM选拔赛--I郊游(数学题)
-
2018年北京信息科技大学第十届程序设计竞赛暨ACM选拔赛 E 233(java)
-
I-永远亭的小游戏(北京信息科技大学第十二届程序设计竞赛暨ACM选拔赛)
-
2018年北京信息科技大学第十届程序设计竞赛暨ACM选拔赛 F 扫雷(java)
-
2018年北京信息科技大学第十届程序设计竞赛暨ACM选拔赛 H-程序员的好印象【LIS】
-
2018年北京信息科技大学第十届程序设计竞赛暨ACM选拔赛 程序员的好印象
-
2018年北京信息科技大学第十届程序设计竞赛暨ACM选拔赛 C 颜料的混合 (计算几何)