设加油时间为 t,那么总用时 = t + y / (v0 + xt) = t + (y / x) / (v0 / x + t)
令 c = y / x,a = v0 / x,那么原式 = t + c / ( t + a) = (t + a) + c / (t + a) - a <= 2 * sqrt(c) - a。
根据基本不等式,我们知道两个数的算术平均值小于等于两个数的几何平均值,当且仅当两者相等时,才取等号。
注意这里有一个隐含条件,t >=0。那么a的平方大于c时,取不到这个最小值。不过没关系,此时原式随着t的增加单调递增,因此t = 0时就是最小值。
#include <cmath> #include <iomanip> #include <iostream> using namespace std; int main() { int v0, x, y; cin >> v0 >> x >> y; double c = (double)y / x; double a = (double)v0 / x; if(a * a <= c) { cout << fixed << setprecision(10) << sqrt(c) * 2 - a; } else { cout << fixed << setprecision(10) << (double)y / v0; } } // 64 位输出请用 printf("%lld")