标签:int 并且 turn mat 相互 过河 时间 重叠 can
你住在村庄\(A\), 每天需要过很多条河到另一个村庄\(B\)上班。\(B\)在\(A\)的右边, 所有的河都在中间。幸运的是, 每条和上都有匀速移动的自动船, 因此每当到达一条河的左岸时, 只需等船过来, 载着你过河, 然后在右岸下船。你很瘦, 因此上船之后船速不变。
日复一日, 年复一年, 你问自己: 从\(A\)到\(B\), 平均情况下需要多长时间? 假设在出门时所有船的位置都是均匀随机分布。如果位置不是在河的端点处, 则朝向也是均匀随机。
在陆地上行走的速度为\(1\)。
输入\(A\)和\(B\)之间河的个数\(n\)、长度\(D\)(\(0 ≤ n ≤ 10\), \(1 ≤ D ≤ 1000\)), 以及每条河的左端点坐标离\(A\)的距离\(p\), 长度\(L\)和移动速度\(v\)(\(0 ≤ p < D\), \(0 < L ≤ D\), \(1 ≤ v ≤ 100\)), 输出\(A\)到\(B\)时间的数学期望。输入保证每条河都在\(A\)和\(B\)之间, 并且相互不会重叠。
过一条河最坏情况时间为\(\frac{3L}{v}\), 即到的时候船刚刚走;
最好情况时间为\(\frac{L}{v}\), 即到的时候船刚刚来。
因为船的位置是均匀随机分布, 因此期望过河时间为\(\frac{2L}{v}\)。
把所有\(\frac{2L}{v}\)加起来, 再加上\(D - \Sigma L_i\)即可。
#include <cstdio>
int n, D, cases;
double ans, sum, L, v;
int main(int argc, char const *argv[]) {
while (~scanf("%d %d", &n, &D) && (n || D)) {
ans = sum = 0.0;
for (register int i(0); i < n; ++i) {
scanf("%lf %lf %lf", &L, &L, &v);
ans += 2.0 * L / v,
sum += L;
}
ans += double(D) - sum;
printf("Case %d: %.3lf\n\n", ++cases, ans);
}
return 0;
}
UVa 12230 Crossing Rivers (数学期望)
标签:int 并且 turn mat 相互 过河 时间 重叠 can
原文地址:https://www.cnblogs.com/forth/p/9722196.html