首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

計算幾何經典問題:Build a Fence(圍欄最大面積)解題分析

     編輯:程式設計疑難解答

問題描述

有一堵無限長的牆,你有一根長度為 L 的圍欄,圍欄兩端必須靠在牆上,中間可以任意形狀。求圍欄與牆圍成的**最大面積**。

輸入多組測試用例,每行一個整數 L (1 ≤ L ≤ 100),L=0 結束。輸出對應的最大面積。

數學建模與推導

幾何直覺

  • 圍欄與牆形成封閉區域,牆作為一條邊
  • 根據**等周不等式**,固定周長下圓面積最大
  • 但此處牆為直線邊界,最優形狀為**半圓**

數學證明

設圍欄彎曲形成半圓,半徑為 r,則圍欄長度(半圓周長):

L = πr → r = L/π

半圓面積:

A = ½πr² = ½π(L/π)² = L²/(2π)

算法實現

核心公式

Area = L * L / (2 * π)

C++ 參考代碼

#include <cstdio>
#include <cmath>

int main() {
    const double PI = acos(-1.0);  // 高精度 π
    int L;
    while (scanf("%d", &L) == 1 && L != 0) {
        double area = (double)L * L / (2.0 * PI);
        printf("%.2f\n", area);  // 保留兩位小數
    }
    return 0;
}

Java 參考代碼

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNextInt()) {
            int L = sc.nextInt();
            if (L == 0) break;
            double area = (double) L * L / (2 * Math.PI);
            System.out.printf("%.2f\n", area);
        }
    }
}

樣例驗證

輸入 L計算過程輸出面積
11²/(2π) ≈ 0.159150.16
10010000/(2π) ≈ 1591.5491591.55

與題目樣例輸出 0.16 和 1591.55 完全吻合(題目樣例輸出格式為連續輸出無換行,實際應每行一個)。

擴展思考

  • 變體問題:若圍欄兩端不固定在牆上,而是自由封閉,最優為正圓,面積 L²/(4π)
  • 多邊形逼近:正多邊形邊數趨近無窮時趨近圓形,驗證等周定理
  • 微積分變分法:可用歐拉-拉格朗日方程嚴格證明半圓為極值解

參考資源

TH7 編程網 - Build a Fence 詳細解析

本質是一道**等周問題**的變體,掌握「固定周長半圓面積最大」的幾何結論,即可 O(1) 解決。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved