Loading

P1284 三角形牧场 贪心+随机化

P1284 三角形牧场 贪心+随机化

题意

给定\(n\) 条长度为\(l\) 的边,问如何构成一个三角形使得面积最大

\[3\leq n \leq 40,1\leq 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);
}
posted @ 2020-09-06 21:45  MQFLLY  阅读(144)  评论(0编辑  收藏  举报