AC

许诺  •  2天前


#include <iostream>
#include <vector>
#include <cmath>
#include <algorithm>

using namespace std;

int main() {

int n;
cin >> n;
vector<int> lengths(n);
int total = 0;
for (int i = 0; i < n; ++i) {
    cin >> lengths[i];
    total += lengths[i];
}

int max_possible = total / 2;
vector<vector<bool>> dp(max_possible + 1, vector<bool>(n + 1, false));
dp[0][0] = true;

for (int l : lengths) {
    for (int k = max_possible; k >= l; --k) {
        for (int cnt = n - 1; cnt >= 0; --cnt) {
            if (dp[k - l][cnt]) {
                dp[k][cnt + 1] = true;
            }
        }
    }
}

int max_area = -1;
for (int a = 1; a <= max_possible; ++a) {
    for (int cnt_a = 1; cnt_a <= n; ++cnt_a) {
        if (!dp[a][cnt_a]) continue;
        int remaining = n - cnt_a;
        if (remaining < 2) continue;
        int max_b = (total - a) / 2;
        for (int b = max(1, a); b <= max_b; ++b) {
            for (int cnt_b = 1; cnt_b <= remaining; ++cnt_b) {
                if (!dp[b][cnt_b]) continue;
                int c = total - a - b;
                if (c <= 0) continue;
                if (a + b <= c) continue;
                int cnt_c = n - cnt_a - cnt_b;
                if (cnt_c < 1) continue;
                if (!dp[c][cnt_c]) continue;
                double s = total / 2.0;
                double area = sqrt(s * (s - a) * (s - b) * (s - c));
                int current_area = static_cast<int>(area * 100);
                if (current_area > max_area) {
                    max_area = current_area;
                }
            }
        }
    }
}

cout << max_area << endl;
return 0;

}


评论:

请先登录,才能进行评论