题解 | #qcjj寄快递#
qcjj寄快递
https://www.nowcoder.com/practice/229bbec64b6b42e48171bef8f88ada47
#include <bits/stdc++.h>
using namespace std;
#define double long double
double fx(double x, double A) {
return 2 * x + 2 * A / pow(2, x);
}
double dfx(double x, double A) {
return 2 - 2 * A * logl(2) / pow(2, x);
}
int main() {
int T;
cin >> T;
vector<pair<double, double>> mp(T);
for (int i = 0; i < T; i++) {
cin >> mp[i].first >> mp[i].second;
}
double sum = 0;
double perc = 1e-9;
for (int i = 1; i < T; i++) {
double e = sqrt(pow(mp[i].first - mp[i - 1].first, 2) +
pow(mp[i].second - mp[i - 1].second, 2));
double l = 0, r = 60.0;
while (r - l > perc) {
double mid = (l + r) / 2;
if (dfx(mid, e) > 0) {
r = mid;
} else {
l = mid;
}
}
sum += fx(l, e);
}
cout << setprecision(9) << fixed << sum;
}
思路:
注意到原函数为
f(x)=2x+2∗e2x
对原函数求导后可得
f′(x)=2−2elg(2)2x
遂可用二分法进行求解
