0%

[題解]ZJ d269 11579 Triangle Trouble

ZJ d269: 11579 - Triangle Trouble

題目連結

題目敘述
有一個三角形工廠有一個很大的問題。給你一些邊的邊長,想辦法找出用這些邊長圍出最大的三角形。

根據海龍公式,三角形面積:

可以利用貪婪法,將所有邊長由大到小進行排序,每一次拿最大的三個邊長進行枚舉,即可算出最大的三角形面積。不難理解,當換上一個比較大的邊,算出來的s也會比較大,跟邊相減的值也會比較大,總面積自然較大(好啦,這是非常不嚴謹的證明XD)

在想題過程中,我有思考到,如果周長一樣的情況下,到底何種面積的三角形面積會比較大?答案是正三角形!

三角形周長固定下面積的比較
根據海龍公式:

想要比較在周長固定下三角形的面積,可以用算幾不等式比較,因為 $s$ 是定值,所以可以列出以下式子:

等好成立時,$a=b=c$。因為$s = \frac{a+b+c}{2}$,因此:

得到海龍公式

以下是使用貪婪法的AC Code:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <bits/stdc++.h>
#define Orz ios::sync_with_stdio(0),cin.tie(0)
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define pii pair<int,int>
#define pdd pair<double,double>
#define ll long long
#define ld double
#define N 100001
#define all(x) x.begin(),x.end()
#define eps 1e-9
#define x first
#define y second
using namespace std;
int t,n;
vector<ld> p;

ld area(ld a ,ld b, ld c){
if(a > b + c)return -1;
ld p = (a+b+c)/2;
return p*(p-a)*(p-b)*(p-c);
}

signed main(){
Orz;
cin>>t;
while(t--){
cin>>n;
p.assign(n,0);
rep(i,0,n-1)cin>>p[i];
sort(all(p),greater<>());
ld ans = 0;
rep(i,0,n-3)
ans = max(ans,area(p[i],p[i+1],p[i+2]));
cout<<fixed<<setprecision(2);
cout<<sqrt(ans)<<endl;
}
}