题解 | #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 遂可用二分法进行求解

全部评论

相关推荐

01-12 20:31
东北大学 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务