题目描述
M小学组织小朋友们去春游,一共有n个小朋友参加这次集体活动,他们需要走 s 米的路程才能到达 目的地。每个学生的行走速度是 v1,为了减少在路程上消耗的时间,学校决定租一辆公交车,公交车 的座位可以容纳 k 个人,为了保证安全,公交车不能容纳k人以上,公交车的行驶速度是 v2。为避免 小朋友们出现晕车的情况,每个学生只能坐不超过1次的公交车。
公交车的停靠、倒车时间以及小朋友的上下车时间都可以忽略不计。现在请帮帮老师们确定n个学生 到达目的地所需的最短时间。
输入格式
只有一行:包括五个正整数
n
,
s
,
v
1
,
v
2
n,s,v1,v2
n,s,v1,v2和k,分别代表学生数量、路程长度、学生行走速度、汽车 驾驶速度和汽车可容纳人数。
(
1
<
=
n
<
=
10000
,
1
<
=
s
<
=
1
e
9
,
1
<
=
v
1
<
v
2
<
=
1
e
9
,
1
<
=
k
<
=
n
)
(1 <= n <= 10000,1 <= s <= 1e9,1 <= v1 < v2 <= 1e9,1 <= k <= n)
(1<=n<=10000,1<=s<=1e9,1<=v1<v2<=1e9,1<=k<=n)
输出格式
输出所有学生可以到达目的地的最短时间,误差不能超过0.000001
输入输出样例
输入 #1
5 10 1 2 5
输出 #1
5.0000000000
输入 #2
1 1 1 2 1
输出 #2
0.5000000000
输入 #3
10 20 1 2 5
输出 #3
14.0000000000
说明/提示
数据范围
对于50%的数据,
1
<
=
s
<
=
1000
,
1
<
=
v
1
<
v
2
<
=
1000
1 <= s <= 1000,1 <= v1 < v2 <= 1000
1<=s<=1000,1<=v1<v2<=1000
对于75%的数据,
1
<
=
s
<
=
10000
,
1
<
=
v
1
<
v
2
<
=
10000
1 <= s <= 10000,1 <= v1 < v2 <= 10000
1<=s<=10000,1<=v1<v2<=10000
对于100%的数据,
1
<
=
s
<
=
1
e
9
,
1
<
=
v
1
<
v
2
<
=
1
e
9
1 <= s <= 1e9,1 <= v1 < v2 <= 1e9
1<=s<=1e9,1<=v1<v2<=1e9
样例解释
样例一:
5个学生可以全部上公交车,并且时间是
10
/
2
=
5
10 / 2 = 5
10/2=5
样例二:
1个学生可以全部上公交车,并且时间是
1
/
2
=
0.5
1 / 2 = 0.5
1/2=0.5
样例三:
10个学生,公交车一次可容纳5人,所以公交车需要接两次学生。第一次公交车带5个学生走到12 米,共
12
/
2
=
6
12 / 2 = 6
12/2=6分钟,5个学生下车后走到目的地需要
(
20
−
12
)
/
1
=
8
(20 - 12)/ 1 = 8
(20−12)/1=8分钟,第一批学生到达终 点需要14分钟。在12米处停车之后,公交车回去接剩下的学生,公交车和第二批学生在8米处相遇, 此时第二批学生走了8 / 1 = 8分钟,公交车带着第二批学生直接到达目的地,第二批学生坐车时间为
(
20
−
8
)
/
2
=
6
(20 - 8)/ 2 = 6
(20−8)/2=6分钟,第二批学生共耗时
8
+
6
=
14
8 + 6 = 14
8+6=14分钟。第一批学生和第二批学生用时相同,皆 为14分钟
解题思路
看问题目后我人都傻了,这是小奥中一道非常经典的 来回接送行程问题呀。。。
被小奥摧残了那么多年,终于让它有用武之地了。由于我太懒了,解题思路过于繁琐,SO,康康上面那篇博客吧。
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<algorithm>
#include<iomanip>
#include<queue>
using namespace std;
long double ans,w,t,n,s,v1,v2,k;
int main() {
cin>>n>>s>>v1>>v2>>k;
w=ceil(n*1.0/k);
k=v2*1.0/v1*1.0;
t=1+(k-1)*1.0/2+w-1;
t=s*1.0/t;
ans=(w-1)*t*1.0/v1*1.0+(1+(k-1)/2)*t*1.0/v2*1.0;
cout<<fixed<<setprecision(10)<<ans<<endl;
}