uva 10668 - Expanding Rods(二分)

题目链接:uva 10668 - Expanding Rods

题目大意:有一根长度为L的木棍被固住两端,现在为它加热,木棍受热增长L=(1+nC)L长度变长,形成弧形。求木棍中心的偏离高度。

解题思路:因为L形成圆弧形,所以二分圆心角,判断即可。

#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>

using namespace std;
const double pi = 4 * atan(1.0);

double parabola_length (double w, double x) {
    double r = w / sin(x/2);
    return x * r;
}

double bsearch (double l, double r, double v, double w) {
    for (int i = 0; i < 100; i++) {
        double mid = l + (r - l) / 2;
        if (parabola_length(w, mid) < v)
            l = mid;
        else
            r = mid;
    }
    return r;
}

double solve (double w, double x) {
    return (1 - cos(x/2)) * w / sin(x/2);
}

int main () {
    double L, l, n, c;
    while (scanf("%lf%lf%lf", &L, &n, &c) == 3) {
        if (L < 0 && n < 0 && c < 0)
            break;
        l = (1 + n * c) * L;
        printf("%.3lf\n", solve(L/2, bsearch(0, pi, l, L/2)));
    }
    return 0;
}

你可能感兴趣的:(uva 10668 - Expanding Rods(二分))