圓桌半徑 r,長方形披薩寬 w、長 l(1 ≤ w ≤ l ≤ 1000)。判斷披薩能否**完全放入桌面內**(允許邊緣相切,不允許超出)。多組測試,r=0 結束。
輸入:
38 40 60
35 20 70
50 60 800
輸出:
Pizza 1 fits on the table.
Pizza 2 does not fit on the table.
Pizza 3 fits on the table.
長方形能放入圓內 ⇔ **長方形對角線長度 ≤ 圓直徑**
證明:長方形外接圓半徑 = 對角線/2。若外接圓半徑 ≤ 圓桌半徑,則長方形完全內含。
d = √(w² + l²)d ≤ 2r ⇔ w² + l² ≤ 4r²(避免浮點運算,全整數判斷)#include
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int r, w, l, idx = 0;
while (cin >> r >> w >> l && r) {
++idx;
// 全整數運算,避免浮點精度問題
bool fits = (w * w + l * l <= 4 * r * r);
cout << "Pizza " << idx << (fits ? " fits on the table." : " does not fit on the table.") << '\n';
}
return 0;
}
| 案例 | r | w | l | w²+l² | 4r² | 結果 | 幾何含義 |
|---|---|---|---|---|---|---|---|
| 1 | 38 | 40 | 60 | 1600+3600=5200 | 4×1444=5776 | 5200 ≤ 5776 ✓ | 對角線 ≈72.1 < 直徑 76 |
| 2 | 35 | 20 | 70 | 400+4900=5300 | 4×1225=4900 | 5300 > 4900 ✗ | 對角線 ≈72.8 > 直徑 70 |
| 3 | 50 | 60 | 800 | 3600+640000=643600 | 4×2500=10000 | 643600 > 10000 ✗ | 樣例輸出 fits?待核對 |
注意: 樣例 3 輸入 `50 60 800` 輸出 `fits`,但 60²+800² = 643600 遠大於 4×50²=10000。推測樣例輸入實為 50 60 80(筆誤),60²+80²=10000 = 4×50²,邊緣相切,符合 `fits`。代碼邏輯以數學判定為準。
本題隱含條件:披薩邊平行於坐標軸(或任意固定方向)。若**允許任意旋轉**,判定條件不變——長方形外接圓半徑不變,旋轉不改變對角線長度。因此**旋轉不影響結論**。
w,l,r ≤ 1000,w*w + l*l ≤ 2,000,000,int(32位)完全安全sqrt 或 double 比較,整數不等式判斷精確且高效≤ 而非 <r=0 終止,**不處理該組**Pizza 1 fits on the table.r 圓內最大面積矩形為邊長 √2 r 的正方形核心洞見: 看似幾何問題,實則是**代數不等式判斷**。將幾何約束轉化為整數運算,是計算幾何中避免精度陷阱、提升性能的核心技巧。