1 条题解

  • 0
    @ 2025-8-24 21:17:54

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar HanSF
    hANsf

    搬运于2025-08-24 21:17:53,当前版本为作者最后更新于2025-03-18 13:14:48,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    题目传送门

    很明显,这道题是一个大分类讨论,根据题意,我们只需要区区 C74=35C_{7}^4 = 35 个 if 语句就可以判断出所有情况。

    #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 记录

    • 1

    信息

    ID
    7691
    时间
    1000ms
    内存
    512MiB
    难度
    3
    标签
    递交数
    0
    已通过
    0
    上传者