社区讨论
被hack求条,悬2关
B4211[常州市赛 2022] 可能的三角形参与者 4已保存回复 7
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 7 条
- 当前快照
- 1 份
- 快照标识符
- @mkb4kl9t
- 此快照首次捕获于
- 2026/01/12 20:14 上个月
- 此快照最后确认于
- 2026/01/16 19:45 上个月
暴力枚举,有点长,虽然我也没指望能有人帮我条
CPP#include<bits/stdc++.h>
using namespace std;
#define int long long
int x[10];
bool ist(int a,int b,int c){
return a+b>c&&a+c>b&&b+c>a;
}
struct node{int a,b,c;}ans[50];
int cnt;
map<int,map<int,map<int,bool> > >mp;
void psh(int a,int b,int c){
if(!mp[a][b][c]){
mp[a][b][c]=1;
ans[++cnt]={a,b,c};
}
}
bool cmp(node x,node y){
if(x.a!=y.a) return x.a<y.a;
if(x.b!=y.b) return x.b<y.b;
return x.c<y.c;
}
signed main(){
cin>>x[1]>>x[2]>>x[3]>>x[4];
sort(x+1,x+5);
//区区35种而已
int a,b,c;
a=x[1],b=x[2],c=x[3];
if(ist(a,b,c)) if(a+b==x[4]||b+c==x[4]||c+a==x[4]||a+b+c==x[4]) psh(a,b,c);
a=x[1],b=x[2],c=x[3]-a;
if(ist(a,b,c)&&a<=b&&b<=c) if(b+c==x[4]||a+b+c==x[4]) psh(a,b,c);
c=x[3]-b;
if(ist(a,b,c)&&a<=b&&b<=c) if(a+b+c==x[4]) psh(a,b,c);
if(a+b==x[3]){
c=x[4]-a;
if(ist(a,b,c)&&a<=b&&b<=c) psh(a,b,c);
c=x[4]-b;
if(ist(a,b,c)&&a<=b&&b<=c) psh(a,b,c);
c=x[4]-b-a;
if(ist(a,b,c)&&a<=b&&b<=c) psh(a,b,c);
}
a=x[1],c=x[2],b=x[3]-a;
if(ist(a,b,c)&&a<=b&&b<=c) if(x[4]==a+c||x[4]==b+c||x[4]==a+b+c) psh(a,b,c);
b=x[3]-c;
if(ist(a,b,c)&&a<=b&&b<=c) if(x[4]==a+b+c) psh(a,b,c);
if(x[3]==a+c){
b=x[4]-c;
if(ist(a,b,c)&&a<=b&&b<=c) psh(a,b,c);
b=x[4]-a-c;
if(ist(a,b,c)&&a<=b&&b<=c) psh(a,b,c);
}
b=x[1],c=x[2],a=x[3]-b;
if(ist(a,b,c)&&a<=b&&b<=c) if(x[4]==a+c||x[4]==b+c||x[4]==a+b+c) psh(a,b,c);
a=x[3]-c;
if(ist(a,b,c)&&a<=b&&b<=c) if(x[4]==b+c||x[4]==a+b+c) psh(a,b,c);
if(x[3]==b+c){
a=x[4]-b-c;
if(ist(a,b,c)&&a<=b&&b<=c) psh(a,b,c);
}
//---------------
a=x[1];
b=x[2]-a;
c=x[3]-a;
if(ist(a,b,c)&&a<=b&&b<=c) if(x[4]==b+c||x[4]==a+b+c) psh(a,b,c);
c=x[3]-b;
if(ist(a,b,c)&&a<=b&&b<=c) if(x[4]==a+b+c) psh(a,b,c);
c=x[2]-a;
b=x[3]-c;
if(ist(a,b,c)&&a<=b&&b<=c) if(x[4]==a+b+c) psh(a,b,c);
//---
b=x[1];
a=x[2]-b;
c=x[3]-a;
if(ist(a,b,c)&&a<=b&&b<=c) if(x[4]==b+c||x[4]==a+b+c) psh(a,b,c);
c=x[3]-b;
if(ist(a,b,c)&&a<=b&&b<=c) if(x[4]==a+b+c) psh(a,b,c);
//x2==a+c, x1==b
//x3只能等于b+c,否则x4没法放
//已经确定了b,c
c=x[3]-b;
a=x[2]-c;
if(ist(a,b,c)&&a<=b&&b<=c) if(x[4]==a+b+c) psh(a,b,c);
//---
c=x[1];
//x2==a+b, x1==c
//x3可以等于a+c、b+c
a=x[3]-c;
b=x[2]-a;
if(ist(a,b,c)&&a<=b&&b<=c) if(x[4]==b+c||x[4]==a+b+c) psh(a,b,c);
b=x[3]-c;
a=x[2]-b;
if(ist(a,b,c)&&a<=b&&b<=c) if(x[4]==a+b+c) psh(a,b,c);
a=x[2]-c,b=x[3]-c;
if(ist(a,b,c)&&a<=b&&b<=c) if(x[4]==a+b+c) psh(a,b,c);
//x1x2x3没有一个等于a/b/c
//a+b,a+c,b+c,a+b+c
//解方程得
int X=(x[1]+x[2]+x[3])/2;
if(X*2==(x[1]+x[2]+x[3])){//是整数
a=X-x[3],b=X-x[2],c=X-x[1];
if(a+b+c==x[4]&&ist(a,b,c)&&a<=b&&b<=c) psh(a,b,c);
}
sort(ans+1,ans+cnt+1,cmp);
for(int i=1;i<=cnt;i++){
cout<<ans[i].a<<" "<<ans[i].b<<" "<<ans[i].c<<"\n";
}
return 0;
}
回复
共 7 条回复,欢迎继续交流。
正在加载回复...