求最大三角形周长
题目:有n根棍子,棍子i的长度为ai。想要从中选出三根棍子组成周长尽可能长的三角形。请输出最大的周长,若无法组成三角形则输出0。
限制条件
3 ≤ n ≤ 100
1 ≤ ai ≤ 10^6
输入
n = 5
a = {2,3,4,5,10}
输出
12(选择3、4、5时)
输入
n = 4
a = {4,5,10,20}
输出
0(无论怎么选都无法组成三角形)
解法:两种
1、暴力遍历时间复杂度n3
#include<cstdio> #include <algorithm> using namespace std; #define MAX_N 100 int n,a[MAX_N]; void solve() { int ans=0; for(int i=0;i<n;i++) { for(int j=i+1;j<n;j++) { for(int k=j+1;k<n;k++) { int len=a[i]+a[j]+a[k]; int ma=max(a[i],max(a[j],a[k])); int rest=len-ma; if(rest>ma) { ans=max(ans,len); } } } } printf("%d\n",ans); } int main(void) { scanf("%d",&n); for(int i=0;i<n;i++) { scanf("%d",&a[i]); } solve(); return 0; }
2、先排序,然后判断相邻三个数是否可以组成三角形即可,时间复杂度取决于排序算法,nlog(n)
#include<cstdio> #include <algorithm> using namespace std; #define MAX_N 100 int n,a[MAX_N]; void solve() { int ans=0; sort(a,a+n); for(int i=0;i<n-2;i++) { if(a[i]+a[i+1]>a[i+2]) { ans=a[i]+a[i+1]+a[i+2]; } } printf("%d\n",ans); } int main(void) { scanf("%d",&n); for(int i=0;i<n;i++) { scanf("%d",&a[i]); } solve(); return 0; }