题解 CF6A 【Triangle】

Mr_WA

2019-10-21 17:38:41

Solution

大家好,我这个蓝名小蒟蒻又双叒叕来写题解啦! 这题毫无疑问是很水的。但想要做这题,首先要知道一个~~幼儿园小班~~小学五年级的道理:三角形的两条短边相加必须大于第三边。 为什么呢?因为,如果两条短边相加等于第三边的话,就无法在两条边之间形成角度,否则就会有两条边够不着彼此,只能形成一条直线,也就是题目中所说的退化的三角形。如果小于的话就更不用说了,三条边互相碰不着。 解释了这么多,现在该开始讲正事儿了。 我们可以用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; } ```