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

HDU 4969 Just a Joke 解題:圓周追擊問題的積分解法

     編輯:C++ 入門

題目大意

女孩在以英雄為圓心、半徑 R 的圓上勻速運動 (速度 v1)。英雄從圓心出發速度 v2 追擊,且三點 (英雄、女孩、圓心) 始終共線。英雄腿疼只能跑距離 D。判斷能否追上。

物理模型與積分

共線條件 ⇒ 英雄與女孩角速度相同 ω = v1/R。英雄徑向速度 v_r,切向速度 v_θ = ω * r = v1 * r / R。總速度 v2^2 = v_r^2 + v_θ^2。

v_r = dr/dt = sqrt(v2^2 - (v1*r/R)^2)。

分離變數積分:


dt = dr / sqrt(v2^2 - (v1^2/R^2) r^2)
t = ∫_0^R dr / sqrt(v2^2 - (v1^2/R^2) r^2)
  = (R/v1) * arcsin(v1/v2)   [三角換元 r = (R v2/v1) sin θ]

英雄跑過總距離 L = v2 * t = (R v2 / v1) * arcsin(v1/v2)。

若 L ≤ D 輸出 "Wake up to code",否則 "Why give up treatment"。

程式碼


int main() {
    int T; cin>>T;
    while (T--) {
        double v1, v2, R, D;
        cin>>v1>>v2>>R>>D;
        double t = R / v1 * asin(v1 / v2);
        double L = t * v2;
        cout << (L > D ? "Why give up treatment" : "Wake up to code") << '\n';
    }
}

注意

  • v1 < v2 否則 asin 定義域錯誤 (題目保證)。
  • 使用 double 精度足夠。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved