例題10-16 過河(Crossing Rivers, ACM/ICPC Wuhan 2009, UVa12230)

歡迎訪問我的Uva題解目錄哦 https://blog.csdn.net/richenyunqi/article/details/81149109

題目描述

例題10-16 過河(Crossing Rivers, ACM/ICPC Wuhan 2009, UVa12230)題目描述

題意解析

你住在村莊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之間,並且相互不會重疊。

算法設計

參考《算法競賽入門經典(第2版)》中的提示:

用數學期望的線性。過每條河的時間爲L/v到3L/v的均勻分佈,因此期望過河時間爲2L/v。把所有2L/v加起來,再加上D-sum(L)即可。

C++代碼

#include<bits/stdc++.h>
using namespace std;
int main(){
    int n,d,p,l,v;
    for(int ii=1;cin>>n>>d&&d!=0;++ii){
        double ans=0.0,suml=0.0;
        for(int i=0;i<n;++i){
            cin>>p>>l>>v;
            ans+=2.0*l/v;
            suml+=l*1.0;
        }
        printf("Case %d: %.3f\n\n",ii,ans+d-suml);
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章