• UVA12230 过河 Crossing Rivers


    UVA12230 过河 Crossing Rivers

    题目大意

    一条直线上有(A)(B)两点,假设(B)(A)的右边,两者之间的距离为(D),且两点间有(n)条河,每条河上都有匀速移动的自动船,船会往返在河的两岸,人到达河岸时,船的位置是随机的,必须船到左岸,才能坐船,假设在出门时所有船的位置都是均匀随机分布。如果位置不是在河的端点处,则朝向也是均匀随机。在陆地上行走的速度为1,告诉你每条河的左端点坐标离(A)的距离(p),长度(L)和移动速度,求出(A)(B)时间的数学期望

    思路

    过每条河时,分两种情况讨论:

    1. 过每条河最坏的情况是(t= 3* frac{L}{v}),去的时候船刚刚从左岸出发。
    2. 过每条河最优的情况是(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;
    }
    
  • 相关阅读:
    洛谷P2062 分队问题
    bzoj1800 飞行棋
    UVA11100 The Trip, 2007
    UVA11134 Fabled Rooks
    每天一道博弈论之“威佐夫博弈”
    每天一道博弈论之“A game”(伪博弈
    每天一道博弈论之“谁能赢呢?”
    每天一道博弈论之“牛的数字游戏”
    每天一道博弈论之“E&D”
    每天一道博弈论之“巴什博弈”
  • 原文地址:https://www.cnblogs.com/loceaner/p/12363730.html
Copyright © 2020-2023  润新知