18. 分积木

100 阅读1分钟

Solo 和 koko 是两兄弟,妈妈给了他们一大堆积木,每块积木上都有自己的重量。

现在他们想要将这些积木分成两堆。

哥哥 Solo 负责分配,弟弟 koko 要求两个人获得的积木总重量“相等”(根据 Koko 的逻辑),个数可以不同,不然就会哭,但 koko 只会先将两个数转成二进制再进行加法,而且总会忘记进位(每个进位都忘记)。

如当 25(11001)加 11(01011)时,koko 得到的计算结果是 18(10010):

 11001
+01011
--------
 10010

Solo 想要尽可能使自己得到的积木总重量最大,且不让 koko 哭。

输入描述

第一行是一个整数 N,表示有多少块积木

  • 2 ≤ N ≤ 100

第二行为空格分开的 N 个整数 Ci,表示第 i 块积木的重量

  • 1 ≤ Ci ≤ 10^6

输出描述

如果能让 koko 不哭,输出 Solo 所能获得积木的最大总重量;

否则输出“NO”。

用例

输入3 3 5 6
输出11
说明
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main()
{
    int n;
    cin >> n;
    vector<int>vec(n);
    for (int i = 0; i < n; i++) {
        cin >> vec[i];
    }

    sort(vec.begin(), vec.end(), greater<int>());
    int sum = 0;
    int tmp = 0;
    for (int i = 0; i < vec.size() - 1; i++) {
        tmp ^= vec[i];
        sum += vec[i];
    }
    tmp ^= vec.back();
    if (tmp == 0) {
        cout << sum << endl;
    } else {
        cout << "NO" << endl;
    }
    return 0;
}