1 条题解
-
0
📝 题目大意
给定四个整数 (),判断是否存在一种方案,将这四个数分成两组,使得两组之和相等。
💡 解题思路
-
题目分析:四个数要分成"已吃"和"未吃"两组,本质上是判断是否存在一个子集,其和等于剩余元素之和。由于四个数全部为正整数,空集和全集的划分不可能相等(和为 与 ),因此只需考虑 个或 个元素的子集。
-
算法推导:数据规模极小(仅 个数),直接枚举所有可能的划分方案即可。将四个数分成和相等的两组,等价于某一组的和等于总和的一半,即 。
-
2+2 划分:从四个数中选两个作为一组,共有 种本质不同的划分(因为选哪两个作为"已吃"与选另外两个是对称的):
-
1+3 划分:一个数单独作为一组,另外三个作为另一组,共 种情况:
只要上述 种情况中任意一个成立,答案即为
Yes,否则为No。std.cpp 中还额外检查了 的对称形式(如 ),与 等价,不影响正确性。 -
-
边界与细节:
- 所有数值最大为 ,四个数之和最大为 ,在 32 位
int范围内(约 ),不会溢出。 - 没有特殊的 或零值情况,所有输入均为正整数。
- 注意判断条件中
==比较的是整数值,不存在浮点精度问题。
- 所有数值最大为 ,四个数之和最大为 ,在 32 位
⏱️ 复杂度分析
- 时间复杂度:。仅需常数次(最多 次)整数比较,与输入规模无关。
- 空间复杂度:。仅使用 个
int变量存储输入,无额外数组或递归。
💻 标准代码 (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
- 上传者