题目:
有n根棍子,棍子i的长度为ai,想要从中选出3根棍子组成周长尽可能长的三角形,请输出最大的周长,若无法组成三角形则输出0。
例如:
输入:
n= 5
a= { 2, 3, 4, 5, 10}
输出:
12(选择3,4,5时)
输入:
n= 4
a= {4, 5, 10, 20}
输出:
0(无论怎么选都无法组成三角形)
代码:
1、
/*枚举 时间复杂度O(n^3)*/ #include<bits/stdc++.h> using namespace std; int a[105]; int solve(int n) { int ans = 0; for(int i = 1; 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 maxn = max(a[i],max(a[j],a[k])); int rest = len - maxn; if(rest > maxn) { ans = max(ans, len); } } } } return ans; } int main() { int n; while(~scanf("%d",&n)) { for(int i = 0; i < n; i++) { scanf("%d",&a[i]); } int ans = solve(n); printf("%d\n",ans); } return 0; }
2、
/*周长最长,排序选最大 时间复杂度O(nlog(n))*/ #include<bits/stdc++.h> using namespace std; int n, a[105]; int solve(int n) { sort(a, a+n); int res = 0; for(int i = n-1; i >= 1; i--){ if(a[i-1] + a[i-2] > a[i]) return a[i-1] + a[i-2] + a[i]; } return res; } int main() { int n; while(~scanf("%d",&n)) { for(int i = 0; i < n; i++) { scanf("%d",&a[i]); } int ans = solve(n); printf("%d\n",ans); } return 0; }