算法
(暴力枚举、几何) $O(n)$
对于一个障碍物来说,它的顶部到UFO的斜率是 $\frac{H - h}{D - d}$,所以我们需要爬的最小高度是 $\max(0, H - D \times \frac{H - h}{D - d})$
如果有多个障碍物,那么答案是 $\max(0, H - D \times \frac{H - h_i}{D - d_i})$
C++ 代码
#include <bits/stdc++.h>
#define rep(i, n) for (int i = 0; i < (n); ++i)
using std::cin;
using std::cout;
using std::max;
int main() {
int n, D, H;
cin >> n >> D >> H;
double ans = 0;
rep(i, n) {
int d, h;
cin >> d >> h;
double now = H - double(H - h) * D / (D - d);
ans = max(ans, now);
}
printf("%.10f\n", ans);
return 0;
}