UVA12230 过河 Crossing Rivers
UVA12230 过河 Crossing Rivers
题目大意
一条直线上有\(A\)和\(B\)两点,假设\(B\)在\(A\)的右边,两者之间的距离为\(D\),且两点间有\(n\)条河,每条河上都有匀速移动的自动船,船会往返在河的两岸,人到达河岸时,船的位置是随机的,必须船到左岸,才能坐船,假设在出门时所有船的位置都是均匀随机分布。如果位置不是在河的端点处,则朝向也是均匀随机。在陆地上行走的速度为1,告诉你每条河的左端点坐标离\(A\)的距离\(p\),长度\(L\)和移动速度,求出\(A\)到\(B\)时间的数学期望
思路
过每条河时,分两种情况讨论:
- 过每条河最坏的情况是\(t= 3* \frac{L}{v}\),去的时候船刚刚从左岸出发。
- 过每条河最优的情况是\(t=\frac{L}{v}\),即去的时候船刚好到左岸。
因为船均匀发布,符合线性性质,因此平均下来过每条河的时间\(t=2*\frac{L}{v}\)。
所以我们在一开始先将答案赋值为全部步行所需的时间\(\frac{D}{1}\),然后在过每条河时加上\(2*\frac{L}{v}\),再减去过河步行需要走的时间\(\frac{L}{1}\),就可以得出期望时间
代码
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
//#define int long long
using namespace std;
const int A = 1e5 + 11;
const int B = 1e6 + 11;
const int mod = 1e9 + 7;
const int inf = 0x3f3f3f3f;
inline int read() {
char c = getchar(); int x = 0, f = 1;
for ( ; !isdigit(c); c = getchar()) if(c == '-') f = -1;
for ( ; isdigit(c); c = getchar()) x = x * 10 + (c ^ 48);
return x * f;
}
int n, m, v, p, l, t = 0;
double ans, k;
int main() {
while (scanf("%d%d", &n, &m) != EOF) {
if (!n && ! m) return 0;
ans = m;
t++;
for (int i = 1; i <= n; i++) {
p = read(), l = read(), v = read();
ans += 1.0 * l * 2 / v;
ans -= l;
}
printf("Case %d: %.3lf\n\n", t, ans);
}
return 0;
}
转载不必联系作者,但请声明出处