题解:B4211 [常州市程序设计小能手 2022] 可能的三角形

· · 题解

题目传送门

很明显,这道题是一个大分类讨论,根据题意,我们只需要区区

``` #include <bits/stdc++.h> #define int long long using namespace std; struct node{ int x,y,z; }tmp[105]; bool cmp(node a,node b){ if(a.x!=b.x) return a.x<b.x; if(a.y!=b.y) return a.y<b.y; return a.z<b.z; } int tot = 0; void check(int a1,int a2,int a3){ // 判断是否合法。 if(a1<0||a2<0||a3<0) return; if(a1+a2>a3&&a2+a3>a1&&a1+a3>a2&&a1<=a2&&a2<=a3) tmp[++tot] = {a1,a2,a3}; } signed main(){ ios::sync_with_stdio(false); cin.tie(0);cout.tie(0); int x[5];cin>>x[1]>>x[2]>>x[3]>>x[4]; sort(x+1,x+5); if(x[1]+x[2]==x[4]){ //1 int a1 = x[1],a2 = x[2],a3 = x[3]; check(a1,a2,a3); } if(x[1]+x[3]==x[4]){ //2 int a1 = x[1],a2 = x[2],a3 = x[3]; check(a1,a2,a3); } if(x[2]+x[3]==x[4]){ //3 int a1 = x[1],a2 = x[2],a3 = x[3]; check(a1,a2,a3); } if(x[1]+x[2]+x[3]==x[4]){ //4 int a1 = x[1],a2 = x[2],a3 = x[3]; check(a1,a2,a3); } if(x[1]+x[2]==x[3]){ //5 int a1 = x[1],a2 = x[2],a3 = x[4]-x[1]; check(a1,a2,a3); } if(x[1]+x[2]==x[3]){ //6 int a1 = x[1],a2 = x[2],a3 = x[4]-x[2]; check(a1,a2,a3); } if(x[1]+x[2]==x[3]){ //7 int a1 = x[1],a2 = x[2],a3 = x[4]-x[3]; check(a1,a2,a3); } if(x[3]-x[1]==x[4]-x[2]){ //8 int a1 = x[1],a2 = x[2],a3 = x[3]-x[1]; check(a1,a2,a3); } if(x[2]+x[3]==x[4]){ //9 int a1 = x[1],a2 = x[2],a3 = x[3]-x[1]; check(a1,a2,a3); } if(x[1]+x[3]==x[4]){ //10 int a1 = x[1],a2 = x[2],a3 = x[3]-x[2]; check(a1,a2,a3); } if(x[1]+x[2]==x[4]){ //11 int a1 = x[1],a2 = x[3]-x[1],a3 = x[2]; check(a1,a2,a3); } if(x[2]+x[3]-x[1]==x[4]){ //12 int a1 = x[1],a2 = x[3]-x[1],a3 = x[2]; check(a1,a2,a3); } if(x[2]+x[3]==x[4]){ //13 int a1 = x[1],a2 = x[3]-x[1],a3 = x[2]; check(a1,a2,a3); } if(x[1]+x[2]==x[3]){ //14 int a1 = x[1],a2 = x[4]-x[2],a3 = x[2]; check(a1,a2,a3); } if(x[1]+x[2]==x[3]){ //15 int a1 = x[1],a2 = x[4]-x[3],a3 = x[2]; check(a1,a2,a3); } if(x[1]+x[3]==x[4]){ //16 int a1 = x[1],a2 = x[4]-x[1]-x[2],a3 = x[2]; check(a1,a2,a3); } if(x[2]+x[3]-x[1]*2==x[4]){ //17 int a1 = x[1],a2 = x[2]-x[1],a3 = x[3]-x[1]; check(a1,a2,a3); } if(x[2]+x[3]-x[1]==x[4]){ //18 int a1 = x[1],a2 = x[2]-x[1],a3 = x[3]-x[1]; check(a1,a2,a3); } if(x[1]+x[3]==x[4]){ //19 int a1 = x[1],a2 = x[2]-x[1],a3 = x[4]-x[2]; } if(x[1]+x[3]==x[4]){ //20 int a1 = x[1],a2 = x[4]-x[2],a3 = x[2]-x[1]; check(a1,a2,a3); } if(x[3]-x[1]==x[4]-x[2]){ //21 int a1 = x[3]-x[1],a2 = x[1],a3 = x[2]; check(a1,a2,a3); } if(x[1]+x[2]==x[4]){ //22 int a1 = x[3]-x[1],a2 = x[1],a3 = x[2]; check(a1,a2,a3); } if(x[2]+x[3]==x[4]){ //23 int a1 = x[3]-x[1],a2 = x[1],a3 = x[2]; check(a1,a2,a3); } if(x[1]+x[2]==x[4]){ //24 int a1 = x[3]-x[2],a2 = x[1],a3 = x[2]; check(a1,a2,a3); } if(x[1]+x[3]==x[4]) { //25 int a1 = x[3]-x[2],a2 = x[1],a3 = x[2]; check(a1,a2,a3); } if(x[1]+x[2]==x[3]){ //26 int a1 = x[4]-x[3],a2 = x[1],a3 = x[2]; check(a1,a2,a3); } if(x[2]+x[4]-x[1]*2==x[3]){ //27 int a1 = x[2]-x[1],a2 = x[1],a3 = x[4]-x[1]; check(a1,a2,a3); } if(x[1]+x[3]==x[4]){ //28 int a1 = x[2]-x[1],a2 = x[1],a3 = x[4]-x[2]; check(a1,a2,a3); } if(x[2]+x[3]-x[1]==x[4]){ //29 int a1 = x[2]-x[1],a2 = x[1],a3 = x[3]-x[1]; check(a1,a2,a3); } if(x[1]+x[2]==x[4]){ //30 int a1 = x[4]-x[3],a2 = x[1],a3 = x[3]-x[1]; check(a1,a2,a3); } if(x[3]+x[4]-x[1]*2==x[2]){ //31 int a1 = x[3]-x[1],a2 = x[4]-x[1],a3 = x[1]; check(a1,a2,a3); } if(x[1]+x[2]==x[4]){ //32 int a1 = x[3]-x[1],a2 = x[4]-x[3],a3 = x[1]; check(a1,a2,a3); } if(x[1]+x[2]==x[4]){ //33 int a1 = x[4]-x[3],a2 = x[3]-x[1],a3 = x[1]; check(a1,a2,a3); } if(x[2]+x[3]-x[1]==x[4]){ //34 int a1 = x[4]-x[3],a2 = x[3]-x[1],a3 = x[1]; check(a1,a2,a3); } if(x[1]+x[2]+x[3]==x[4]*2){ //35 int a1 = (x[1]+x[2]-x[3])/2,a2 = (x[1]-x[2]+x[3])/2,a3 = (x[2]-x[1]+x[3])/2; check(a1,a2,a3); } sort(tmp+1,tmp+tot+1,cmp); // 排序,用来去重。 cout<<tmp[1].x<<" "<<tmp[1].y<<" "<<tmp[1].z<<'\n'; for(int i=2;i<=tot;i++){ if(tmp[i].x!=tmp[i-1].x||tmp[i].y!=tmp[i-1].y||tmp[i].z!=tmp[i-1].z){ // 去重 cout<<tmp[i].x<<" "<<tmp[i].y<<" "<<tmp[i].z<<'\n'; } } return 0; } ``` [AC 记录](https://www.luogu.com.cn/record/208618562)。