题解:B4211 [常州市程序设计小能手 2022] 可能的三角形
HanSF
·
·
题解
题目传送门
很明显,这道题是一个大分类讨论,根据题意,我们只需要区区
```
#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)。