题解 CF6A 【Triangle】

Heartlessly

2018-02-15 16:09:40

Solution

## 算法介绍 - 据说这道题的正解是暴力枚举什么的,但是蒟蒻在这里给大家介绍另一种~~贪心的~~解法。 - 先把四根木棍的长度按从小到大排序。 - 从四根木棍中挑出三根显然只有 **4** 种方法(如下) 1. **1 2 3** 1. **1 2 4** 1. **1 3 4** 1. **2 3 4** - 排列组合就是:$C_{4}^{3}= \frac{4!}{\left ( 4-3 \right )!3!}= \frac{4\times 3\times 2\times 1}{3\times 2\times 1}= 4$ - 其中有 **2** 种不需要考虑,原因如下: - 如果**第一根木棍和第二根木棍的总长**大于**第四根**,那么就一定大于第三根,所以只要判断**第一根木棍和第二根木棍的总长**与**第三根**的关系。 - 同理,如果**第一根木棍和第三根木棍的总长**大于**第四根**,那么**第二根木棍和第三根木棍的总长**也一定大于**第四根**,所以只要判断**第二根木棍和第三根木棍的总长**与**第四根**的关系。 - 也就是说,**2,3** 两种挑法可以忽略,退化的三角形也一样判断。 - 通过以上思路,并不难写出代码。 ------------ ## 示例代码 ```cpp #include <bits/stdc++.h> using namespace std; int f[5];//数组存比较方便排序 int main(){ for ( int i = 1; i <= 4; i++ ) scanf ( "%d", &f[i] ); sort ( f + 1, f + 5 );//快速排序 if ( f[1] + f[2] > f[3] || f[2] + f[3] > f[4] ) printf ( "TRIANGLE\n" ); else if ( f[1] + f[2] == f[3] || f[2] + f[3] == f[4] ) printf ( "SEGMENT\n" ); else printf ( "IMPOSSIBLE\n" ); return 0; } ```