P1284 三角形牧场 贪心+随机化
题意
给定(n) 条长度为(l) 的边,问如何构成一个三角形使得面积最大
[3leq n leq 40,1leq l leq 40
]
分析
此题也可以转化为背包问题解决,这里采用贪心+随机化
显然可以想到要让面积尽量大,那么三边长应该尽量均匀
那么贪心策略就是每次在最小的那个边里加长度,但是这样直接贪心是没有终点,所以这里采用随机化算法
贪心地构造三条边
代码
ll l[42];
ll a[3];
int main() {
int n = readint();
for (int i = 0; i < n; i++) l[i] = readll();
int times = 1e5 + 5;
ll ans = -1;
while (times--) {
random_shuffle(l, l + n);
a[0] = l[0], a[1] = l[1], a[2] = l[2];
for (int i = 3; i < n; i++) a[min_element(a, a + 3) - a] += l[i];
sort(a, a + 3);
if (a[0] + a[1] <= a[2]) continue;
long double p = (a[0] + a[1] + a[2]) / 2.0;
ans = max(ans, (ll)(100 * sqrt(p * (p - a[0]) * (p - a[1]) * (p - a[2]))));
}
Put(ans);
}