题解 CF6A 【Triangle】
Mr_WA
2019-10-21 17:38:41
大家好,我这个蓝名小蒟蒻又双叒叕来写题解啦!
这题毫无疑问是很水的。但想要做这题,首先要知道一个~~幼儿园小班~~小学五年级的道理:三角形的两条短边相加必须大于第三边。
为什么呢?因为,如果两条短边相加等于第三边的话,就无法在两条边之间形成角度,否则就会有两条边够不着彼此,只能形成一条直线,也就是题目中所说的退化的三角形。如果小于的话就更不用说了,三条边互相碰不着。
解释了这么多,现在该开始讲正事儿了。
我们可以用3个for枚举三角形的三条边用哪条木棍,然后写一个函数,判断这三条边能不能构成三角形,或者是退化的三角形。
如下:
```c
for(int i=1; i<=4; i++)
{
for(int j=1; j<=4; j++)
{
if(i==j)continue;
for(int k=1; k<=4; k++)
{
if(k==i||k==j)continue;
t=max(t,zajtc(a[i],a[k],a[j]));
}
}
}
```
注意中间的continue不能省去,否则同一条木棍会被用多次,自然而然也就会“WA的一声哭了出来”。
zajtc函数如下:
```c
int zajtc(int x,int y,int z)
{
if(x>y)swap(x,y);
if(x>z)swap(x,z);
if(y>z)swap(y,z);
if(x+y==z)return 1;
if(x+y>z)return 2;
if(x+y<z)return 0;
}
```
如上文函数,我们先用前三句话把这三条枚举出来的边排好序,然后返回值,能组成三角形为2,能组成退化的三角形为1,啥都不能为0。
献完整AC程序:
```c
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string>
using namespace std;
int zajtc(int x,int y,int z)
{
if(x>y)swap(x,y);
if(x>z)swap(x,z);
if(y>z)swap(y,z);
if(x+y==z)return 1;
if(x+y>z)return 2;
if(x+y<z)return 0;
}//上文提到过的函数部分
int a[5];
int t;
int main()
{
cin>>a[1]>>a[2]>>a[3]>>a[4];
for(int i=1; i<=4; i++)
{
for(int j=1; j<=4; j++)
{
if(i==j)continue;
for(int k=1; k<=4; k++)
{
if(k==i||k==j)continue;
t=max(t,zajtc(a[i],a[k],a[j]));
}
}
}//上文的程序片段,for循环部分
if(t==0)cout<<"IMPOSSIBLE";
if(t==1)cout<<"SEGMENT";
if(t==2)cout<<"TRIANGLE";//输出,上文提到过,0为不行,1为退化的三角形,2为三角形
return 0;
}
```