# Greedy# Sorting# Geometry# Math

d269 - 11579 - Triangle Trouble

🔗 前往 ZeroJudge 原題

題目描述

題目給定一組長度,要求找出其中能構成的最大三角形面積。如果無法構成三角形,則輸出 0.00。

解題思路

首先,對給定的長度陣列進行排序。然後,從最長的邊開始,嘗試與其他兩條較短的邊組成三角形。如果滿足三角形不等式(最長邊小於其他兩邊之和),則使用海倫公式計算三角形面積,並更新最大面積。如果找不到任何可以構成三角形的三條邊,則輸出 0.00。

複雜度分析

  • 時間複雜度: O(n log n) (主要來自排序)
  • 空間複雜度: O(n) (用於儲存輸入陣列)

程式碼

#include <iostream>
#include <algorithm>
#include <cmath>
#include <iomanip>
using namespace std;
int n,t;
double arr[10001];
int main(){
	cin.tie(0); ios::sync_with_stdio(false);
	cin >> t;
	while(t--){
		cin >> n;
		for(int i=0;i<n;++i){
			cin >> arr[i];
		}
		double ans=0;
		sort(arr,arr+n);
		for(int i=n-1;i>=2;--i){
			if(arr[i]<arr[i-1]+arr[i-2]){ 
				double s=(arr[i]+arr[i-1]+arr[i-2])/2.00;
				ans=max(ans,sqrt(s*(s-arr[i])*(s-arr[i-1])*(s-arr[i-2])));
			}
		}
		cout << fixed << setprecision(2) << ans << '\n';
	}
}

Discussion