HDU6581——Vacation(思維題目)

題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=6581

題意

在一條道路上有n+1n+1輛車,每輛車有自己距離終點的距離ss,自己的車身長度ll和自己的速度vv。注意所有的車不能超車,只能按照順序到達終點。問所有的車到達終點所需要的時間。數據按照從遠到近的順序給出。

題解

這是一個比較有意思的思維題。

  1. 考慮最遠的一輛車。就是編號爲0的車。如果在到達終點的期間沒有碰到一號車,那麼它就是最後一個到達是車,所需要的的時間就是s0v0\frac{s_0}{v_0}
    在這裏插入圖片描述
  2. 如果遇到一號車(假設一號車沒有碰到其他的車)。那麼這兩車到達終點的時間取決了一號車(畢竟走的慢,0號車需要在後面跟着)。那麼需要的時間呢?
    在這裏插入圖片描述
    在這裏插入圖片描述
    根據上面的兩個圖可以知道,一號車走的路程是s1+l1s_1+l_1(需要完全開過終點,0號車才能算到達終點)。所以時間爲s1+l1v1\frac{s_1+l_1}{v_1}

依次類推,如果一號車也碰到了二號車,那麼最終的時間就取決於二號車,時間爲s2+l2+l2v2\frac{s_2+l_2+l_2}{v_2}

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

const int maxn = 1e5+10;

int l[maxn], v[maxn], s[maxn];

int main() {
    int n;
    while(~scanf("%d", &n)) {
        for(int i = 0;i<=n;i++) {
            scanf("%d",&l[i]);
        }
        for(int i = 0;i<=n;i++) {
            scanf("%d", &s[i]);
        }
        for(int  i= 0 ;i<=n;i++) {
            scanf("%d", &v[i]);
        }
        double ans = s[0] * 1.0/ v[0];
        long long sum  =0 ;
        for(int i =1 ;i<=n;i++) {
            sum += l[i];
            ans = max(ans, (sum + s[i])*1.0/v[i]);
        }
        printf("%.10f\n", ans);
    }
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章