牛客周赛 Round 86——E小苯的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;
}

浙公网安备 33010602011771号