1 条题解

  • 0
    @ 2026-6-19 10:31:05

    📝 题目大意

    给定四个整数 A,B,C,DA, B, C, D1A,B,C,D1081 \leq A,B,C,D \leq 10^8),判断是否存在一种方案,将这四个数分成两组,使得两组之和相等。

    💡 解题思路

    1. 题目分析:四个数要分成"已吃"和"未吃"两组,本质上是判断是否存在一个子集,其和等于剩余元素之和。由于四个数全部为正整数,空集和全集的划分不可能相等(和为 00S>0S > 0),因此只需考虑 11 个或 22 个元素的子集。

    2. 算法推导:数据规模极小(仅 44 个数),直接枚举所有可能的划分方案即可。将四个数分成和相等的两组,等价于某一组的和等于总和的一半,即 A+B+C+D2\frac{A+B+C+D}{2}

      • 2+2 划分:从四个数中选两个作为一组,共有 C42/2=3C_4^2 / 2 = 3 种本质不同的划分(因为选哪两个作为"已吃"与选另外两个是对称的):

        • A+B=C+DA+B = C+D
        • A+C=B+DA+C = B+D
        • A+D=B+CA+D = B+C
      • 1+3 划分:一个数单独作为一组,另外三个作为另一组,共 44 种情况:

        • A=B+C+DA = B+C+D
        • B=A+C+DB = A+C+D
        • C=A+B+DC = A+B+D
        • D=A+B+CD = A+B+C

      只要上述 77 种情况中任意一个成立,答案即为 Yes,否则为 No。std.cpp 中还额外检查了 3+13+1 的对称形式(如 B+C+D=AB+C+D = A),与 1+31+3 等价,不影响正确性。

    3. 边界与细节

      • 所有数值最大为 10810^8,四个数之和最大为 4×1084 \times 10^8,在 32 位 int 范围内(约 2.1×1092.1 \times 10^9),不会溢出。
      • 没有特殊的 N=0N=0 或零值情况,所有输入均为正整数。
      • 注意判断条件中 == 比较的是整数值,不存在浮点精度问题。

    ⏱️ 复杂度分析

    • 时间复杂度O(1)O(1)。仅需常数次(最多 1111 次)整数比较,与输入规模无关。
    • 空间复杂度O(1)O(1)。仅使用 44int 变量存储输入,无额外数组或递归。

    💻 标准代码 (C++)

    #include<bits/stdc++.h>
    using namespace std;
    int main(){
    	int a,b,c,d;
    	cin>>a>>b>>c>>d;
    	// 2+2 划分:两组各两个元素
    	if(a+b==c+d){
    		cout<<"Yes";
    		return 0;
    	}else if(a+c==b+d){
    		cout<<"Yes";
    		return 0;
    	}else if(a+d==c+b){
    		cout<<"Yes";
    		return 0;
    	// 1+3 划分:一个元素单独一组
    	}else if(a==c+d+b){
    		cout<<"Yes";
    		return 0;
    	}else if(b==c+d+a){
    		cout<<"Yes";
    		return 0;
    	}else if(c==a+b+d){
    		cout<<"Yes";
    		return 0;
    	}else if(d==a+b+c){
    		cout<<"Yes";
    		return 0;
    	// 3+1 划分:与 1+3 对称,等价冗余检查
    	}else if(a+b+c==d){
    		cout<<"Yes";
    		return 0;
    	}else if(a+b+d==c){
    		cout<<"Yes";
    		return 0;
    	}else if(a+c+d==b){
    		cout<<"Yes";
    		return 0;
    	}else if(b+c+d==a){
    		cout<<"Yes";
    		return 0;
    	}else {
    		cout<<"No";
    		return 0;
    	}
    }
    
    • 1

    信息

    ID
    857
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    (无)
    递交数
    1
    已通过
    1
    上传者