按照二进制加法计算,并且不计算进位 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