题目来源
题目描述
题目解析
分析:
- k的加法不进位,就是在做异或运算
- k不哭的前提是:k和s两方拥有相同重量的糖,也就是说,分成两堆数各自进行异或运算,运算到最后,剩下两个相等的数,那么对于相同的两个数,再做一次异或运算呢?没错,结果是0
- 因此,对于判断是否能够成功分糖,可以将所有的数执行一次异或运算,判断最终结果是否为0即可
- 还有一个问题是S要拿最多的糖?很简单,只需要让k拿最少的糖就行,在分糖成功的情况下,只需要将所有糖ongoDB重量最小的糖分给k即可,因为剩下的糖的总重量经过异或,最终一定会等于k拿到的糖果的重量,因此只需要找出所有数中最小的数和所有数之和即可,最终S分得的糖的重量就等于减去的最小值
所以这道题要解决两个问题:
- 能不能让K不哭
- 怎么才能得到最多的糖
好屑的哥哥
#include <vector>
#include <set>
#include <queue>
#include <stack>
#include <functional>
#include <sstream>
#include <iostream>
#include <algorithm>
#include <map>
#include <random>
#include <ctime>
#include <iterator>
using namespace std;
class Solution{
public:
// (2 ≤ N ≤ 15)
int getCandy(std::vector<int> weight){
int xorSum = weight[0], realSum = weight[0], minWeight = weight[0];
for (int i = 1; i < weight.size(); ++i) {
xorSum ^= weight[i];
realSum += weight[i];
minWeight = std::min(minWeight, weight[i]);
}
if(xorSum != 0){
return -1;
}
return realSum - minWeight;
}
};
int main(){
int N = 0;
std::cin >> N;
std::vector<int> weight (N, 0);
for (int i = 0; i < N; ++i) {
std::cin >> weight[i];
}
Solution a;
auto w = a.getCandy(weight);
std::cout << (w == -1 ? "NO" : to_string(w));
return 0;
}