挑战程序设计竞赛1.6.1例题:三角形
题目:
有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(无论怎么选都无法组成三角形)
这道题大家都知道O(n3)的方法,但是还有一种方法可以以O(nlogn)解决,那就是排序。
从大到小进行排序,从最大开始计算使得连续3个数,看是否能构成三角形,第一个能构成三角形的解就是我们要的解。
为什么呢?
因为如果三个数不连续,即存在e + d > a那么对b + c必定大于a(因为b + c > e + d),所以如果找到最大的连续三条边,那么就是我们想要的答案。
代码:
#include <bits/stdc++.h> using namespace std; int a[105]; bool flag; bool cmp (int x, int y) { return x > y; } int main(void) { int n; scanf("%d", &n); for(int i = 0; i < n; i++) { scanf("%d", &a[i]); } sort(a, a + n, cmp); for(int i = 0; i < n - 2; i++) { if(a[i] < a[i + 1] + a[i + 2]) { flag = true; int ans = a[i] + a[i + 1] + a[i + 2]; printf("%d\n", ans); break; } } if(!flag) printf("0\n"); return 0; }