Official

C - Doukasen Editorial by blackyuki


いくつかの解法が考えられますが、そのうちの \(1\) つを紹介します。

まず、\(2\) つの火がぶつかる時刻 \(T\) を求めます。これは以下のように表されます。

\(T=\frac{1}{2}\sum_{i=1}^{N}\frac{A_i}{B_i}\)

次に、左の火が時刻 \(T\) においてどの地点に到達しているかを求めます。

他にも両端からシミュレーションをしていく解法や二分探索を用いた解法も考えられます。

実装例 (C++)

#include <bits/stdc++.h>
using namespace std;

int main(){
    int n; cin >> n;
    vector<double> a(n), b(n);
    for(int i = 0; i < n; i++) cin >> a[i] >> b[i];
    double t = 0, ans = 0;
    for(int i = 0; i < n; i++) t += a[i] / b[i];
    t /= 2;
    for(int i = 0; i < n; i++){
        ans += min(a[i], t * b[i]);
        t -= min(a[i] / b[i], t);
    }
    cout << fixed << setprecision(15);
    cout << ans << endl;
}

posted:
last update: