题目描述
大哥和小哥是两兄弟,妈妈给了他们一大袋糖,每块糖都有属于自己的重量。
现在他们想要将这些糖分成两堆。分糖的任务当然落到了大哥的身上,然而小哥要求必须两个人获得的糖的总重量“相等”(根据他自己的逻辑),要不然就会哭。
非常不幸的是,小哥还非常小,并且他只会先将两个数转成二进制再进行加法,而且总会忘记进位。例如:
当12(1100)加5(101)时:
0101
+1001
=1100
其他例子:
5 + 4 = 1
7 + 9 = 14
50 + 10 = 56
现在大哥非常贪婪,他想要尽可能使自己得到的糖的总重量最大,且不让小哥哭。
输入描述
输入包含两行:
第一行是一个整数 N(2≤N≤15),表示袋中糖的数量。
第二行包含 N 个用空格分开的整数 Weight_i(1≤Weight_i≤10^6),表示第 i 块糖的重量。
输出描述
如果能让小哥不哭,输出大哥所能获得的糖的总重量;否则输出“NO”。
用例输入
3
1 5 4
解题思路
本题的目标是将糖分成两堆,使得两堆糖的“总重量”(根据题目逻辑)相等,同时最大化获得的糖的总重量。主要思路如下:
- 计算总重量和异或值:遍历所有糖的重量,计算总重量 all 和所有重量的异或值 e。如果异或值 e 不为0,说明无法将糖分成两堆满足要求,直接输出“NO”。
- 处理异或值为0的情况:如果异或值为0,说明可以将糖分成两堆,使得两堆的“总重量”相等。为了最大化自己的糖的总重量,可以将最小的糖分配给小哥,剩下的糖归Tazi。
- 输出结果:输出获得的糖的总重量,即 all - mn,其中 mn 是最小的糖的重量。
代码
复制
#include <iostream>
#include <vector>
#include <queue>
#include <sstream>
#include <string>
#include <stack>
#include <algorithm>
#include <map>
#include <iomanip>
using namespace std;
#define msize 105int main() {ios::sync_with_stdio(false);cin.tie(nullptr);int n;cin >> n;int nums[1005];int all = 0; // 总重量int mn = 1000000; // 最小的糖果重量int e = 0; // 总的异或值for (int i = 0; i < n; i++) {cin >> nums[i];e ^= nums[i]; // 累加异或值mn = min(mn, nums[i]); // 更新最小糖果重量all += nums[i]; // 累加总重量}if (e) { // 异或值不为0,无法分成两堆cout << "NO";} else {cout << all - mn; // 输出获得的糖的总重量}
}