挑战程序设计竞赛-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 }

思路是,先对数组从小到大排序,然后第一根棍子最长,第二根棍子次长,第三根最短,三根棍子分别从大到小遍历,当遇到满足条件的三根棍子,那么不用继续遍历了,此刻已经是最长的棍子了。

 

posted @ 2017-03-03 18:21  陈煜弘  阅读(680)  评论(0编辑  收藏  举报