挑战程序设计竞赛-1.6节-三角形
问题主题:三角形 |
问题描述: 有n根棍子,棍子i的长度为ai,想要从中选出三根棍子组成周长尽可能长的三角形。请输出最大的周长,若无法组成三角形则输出0。 |
样例: 输入 n=5 a={2,3,4,5,10} 输出 12(选择3,4,5时)
输入 n=4 a={4,5,10,20} 输出 0(无法构成三角形) |
代码:
1 #include <iostream> 2 #include <cstdlib> 3 #include <cstdio> 4 #include <algorithm> 5 6 using namespace std; 7 8 int main() 9 { 10 int n,a[101]; 11 scanf("%d",&n); 12 13 for(int i = 0;i < n;i++){ 14 scanf("%d", &a[i]); 15 } 16 17 //sort比qsort快一些 18 sort(a, a+n); 19 20 for(int i = n - 1; i > 1;i--){ 21 for(int j = i - 1; j > 0;j--){ 22 for(int k = j - 1; k >=0; k--){ 23 if(a[i] < a[j] + a[k]){ 24 printf("%d\n",a[i]+a[j]+a[k]); 25 26 goto last; //跳出三重循环,此处使用goto非常方便,但是不能滥用 27 } 28 } 29 } 30 } 31 32 printf("%d---不能组成三角形",0); 33 34 last: 35 return 0; 36 37 38 }
思路是,先对数组从小到大排序,然后第一根棍子最长,第二根棍子次长,第三根最短,三根棍子分别从大到小遍历,当遇到满足条件的三根棍子,那么不用继续遍历了,此刻已经是最长的棍子了。