牛客周赛 Round 86——E小苯的Polygon

题目

小苯的Polygon

题解

对于凸多边形边长满足条件,就像三角形一样,最短边+次短边大于第三条边,可以把凸多边形的两条边给他拉直,拉直的边肯定要小于这两条边,不断重复就可以得到凸多边形的最长的一条边要比其他边之和短。所以我们只要找到当前枚举的这条边作为最长边,如果有其他边之和大于这条边,就可以构造出凸多边形,拿dp[i]记录和为i的边存不存在。

参考代码

#include<iostream>
#include<vector>
#include<cmath>
using namespace std;
const int N = 110;
int main(){
    int _ = 1;
    cin >> _;
    while(_ --){
        int n;
        cin >> n;
        int s = 0;
        vector<int> a(n + 1);
        for(int i = 1; i <= n; i ++){
            cin >> a[i];
            s = max(s, a[i]);
        }
        vector<int> dp(s * n + 1);
        dp[0] = 1;
        int ans = 0x3f;
        for(int i = 1; i <= n; i ++){
            for(int j = a[i] + 1; j <= s * n; j ++){
                if(dp[j]){
                    ans = min(ans, a[i] + j);
                }
            }
            for(int j = s * n; j >= a[i]; j --){
                dp[j] |= dp[j - a[i]];
            }
        }
        if(ans == 0x3f) puts("-1");
        else cout << ans << endl;
    }
    return 0;
}
posted @ 2025-03-26 21:25  PZnwbh  阅读(44)  评论(0)    收藏  举报