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: