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
", t, ans);
}
return 0;
}