按照二进制加法计算,并且不计算进位 12+5=9(1100+0101=1001=9)也就对于当前这一位二进制,新的运算方法1+1=0,0+0=0,1+1=0.进行到这里自然的能想到这就是异或运算,相同为0,否则为1.回到题目也就是当整个数组的异或和为0,那么能平分(两个相同的数异或等于0)B能获取到sum-苹果最轻的哪一个的重量,否则输出-1即可
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define N 100005
int w[N];
int n;
signed main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	cin>>n;
	int sum=0,mi=1000000;
	int dd=0;//异或和
	for(int i=1;i<=n;i++){
		cin>>w[i];
		sum+=w[i];
		mi=min(mi,w[i]);
		dd^=w[i];
	}
	if(dd) cout<<-1<<'\n';
	else cout<<sum-mi<<'\n';
	return 0;
}
def main():
    n = int(input())
    w = list(map(int, input().split()))
    
    sum_values = sum(w)
    min_value = min(w)
    xor_sum = 0
    for value in w:
        xor_sum ^= value
    if xor_sum != 0:
        print(-1)
    else:
        print(sum_values - min_value)
if __name__ == "__main__":
    main()
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        long[] w = new long[n];
        long sum = 0;
        long minValue = Long.MAX_VALUE;
        long xorSum = 0;
        for (int i = 0; i < n; i++) {
            w[i] = scanner.nextLong();
            sum += w[i];
            minValue = Math.min(minValue, w[i]);
            xorSum ^= w[i];
        }
        if (xorSum != 0) {
            System.out.println(-1);
        } else {
            System.out.println(sum - minValue);
        }
    }
}
        A、B两个人把苹果分为两堆,A希望按照他的计算规则等分苹果,他的计算规则是按照二进制加法计算,并且不计算进位 12+5=9(1100+0101=9),B的计算规则是十进制加法,包括正常进位,B希望在满足A的情况下获取苹果重量最多。
输入苹果的数量和每个苹果重量,输出满足A的情况下B获取的苹果总重量。
如果无法满足A的要求,输出−1。
数据范围
输入第一行是苹果数量:3
输入第二行是每个苹果重量:3 5 6
输出第一行是B获取的苹果总重量:11
输入
3
3 5 6
输出
11
输入
8
7258 6579 2602 6716 3050 3564 5396 1773
输出
35165