日期:2026年5月19日
ZeroJudge 題目連結:d269. 11579 - Triangle Trouble
解題想法
讀取一行測資,將 $n$ 個邊長由大到小排序,再依序讀取連續 3 個邊長 $a, b, c$,如果最長的邊 $a$ 大於等於較短的兩個邊 $b, c$ 加總,無法組成三角形;反之,用海龍公式計算三角形面積。
Python 程式碼
使用時間約為 67 ms,記憶體約為 14.4 MB,通過測試。
def solve():
import sys
result = []
data = sys.stdin.read().split()
T = int(data[0]) # T 組測資
ptr = 1
while ptr < len(data): # 執行 T 次
n = int(data[ptr]) # 首項是邊的數量
ptr += 1
edges = sorted(map(float, data[ptr:ptr+n]), reverse=True) # 邊長,由大到小排序
ptr += n
imax = 0.0 # 最大面積
for i in range(n-2): # 依序讀取邊長,每次 3 項
a, b, c = edges[i:i+3] # 邊長
if a >= b + c: # 最長的邊大於等於另外兩個邊相加
continue # 無法組成三角形,找下一組
s = (a + b + c) * 0.5 # 用海龍公式求三角形面積
area = (s * (s-a) * (s-b) * (s-c))**0.5
if area > imax: imax = area # 更新最大值
result.append(f"{imax:.2f}\n")
sys.stdout.write("".join(result))
if __name__ == "__main__":
solve()
C++ 程式碼
不能使用 float,要用 double,否則小數部分會算錯。使用時間約為 16 ms,記憶體約為 3.1 MB,通過測試。
#include <cstdio>
#include <vector>
#include <algorithm>
#include <functional>
#include <cmath>
using namespace std;
int main() {
int T; scanf("%d", &T);
for(int t=0; t<T; t++) {
int n; scanf("%d", &n);
vector<double> edges (n);
for(int i=0; i<n; i++) scanf("%lf", &edges[i]);
sort(edges.begin(), edges.end(), greater<double>());
double imax = 0.0;
for(int i=0; i<n-2; i++) {
double a = edges[i], b = edges[i+1], c = edges[i+2];
if (a >= b + c) continue;
double s = (a + b + c) * 0.5;
double area = sqrt(s * (s-a) * (s-b) * (s-c));
imax = max(imax, area);
}
printf("%.2lf\n", imax);
}
return 0;
}
沒有留言:
張貼留言