1. 分糖果问题解析与算法实现
1.1 问题背景与核心逻辑
肖恩和帕特里克兄弟分糖果的问题看似简单,但蕴含着巧妙的数学原理。问题的关键在于帕特里克使用的特殊加法方式——二进制无进位加法(即按位异或运算)。这种运算在计算机科学中被称为XOR操作,其特点是相同为0,不同为1,且不考虑进位。
举个例子说明:
- 12 (1100) XOR 5 (0101) = 9 (1001)
- 5 (0101) XOR 4 (0100) = 1 (0001)
要实现公平分配,必须满足两堆糖果的XOR值相等。根据XOR运算的性质:
- 任何数XOR自身等于0
- XOR满足交换律和结合律
- 如果总XOR为0,说明可以公平分配
1.2 算法实现与优化
给出的C++代码采用了以下策略:
- 计算所有糖果的总XOR值
- 如果总XOR不为0,直接返回"NO"
- 否则,总价值减去最小糖果价值即为肖恩能获得的最大值
cpp复制#include <bits/stdc++.h>
using namespace std;
int main() {
int T;
cin>>T;
while (T--){
int n;
cin>>n;
vector<int> candies(n);
int totalXor=0;
int totalSum=0;
for (int i = 0; i < n; ++i) {
cin>>candies[i];
totalXor ^= candies[i];
totalSum += candies[i];
}
if (totalXor!=0){
cout<<"NO"<<endl;
} else{
int minCandy = *min_element(candies.begin(),candies.end());
cout<<totalSum-minCandy<<endl;
}
}
r
