首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

POJ 1905 Expanding Rods:二分求桿加熱彎曲隆起高度

     編輯:C++ 入門

POJ 1905 Expanding Rods:二分法求桿中心位移

題目大意:長度 L 的細桿加熱 n 度後膨脹為 L' = (1 + n·C)·L。兩端固定時桿彎成圓弧,原桿長為弦長。求弧中點到弦中點的距離(隆起高度)。輸入多組 L, n, C,以三個負數結束。保證膨脹長度不超過原長 1.5 倍。

幾何關係與二分模型

設弧半徑 R,弦長 L,弧長 L'。幾何關係:
弦長 L = 2R sin(θ) → θ = asin(L / 2R)
弧長 L' = 2Rθ = 2R·asin(L / 2R)
隆起高度 h = R - R cos(θ) = R(1 - cosθ)
由弦長與弧高關係:R = (h² + L²/4) / 2h

目標:找到 h 使得 L' = 2R·asin(L/2R)。h 單調遞增 → L' 單調遞增,可在 [0, L/2] 區間二分 h。

二分核心代碼

double L, n, C;
while (scanf("%lf%lf%lf", &L, &n, &C) == 3) {
    if (L < 0 && n < 0 && C < 0) break;
    double L1 = (1 + n * C) * L;
    double low = 0, high = L / 2, mid;
    while (high - low > 1e-5) {
        mid = (low + high) / 2;
        double R = (mid*mid + L*L/4) / (2*mid);
        double arc = 2 * R * asin(L / (2*R));
        if (arc <= L1) low = mid;
        else high = mid;
    }
    printf("%.3lf\n", mid);
}

精度與邊界

  • 二分終止條件 high - low > 1e-5 保證輸出小數點後三位正確。
  • h 最大不超過 L/2(半圓情況),作為高邊界。
  • 注意 asin 參數域 [-1,1],L/(2R) 恆 ≤ 1。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved