华为OD机试真题目录:真题目录
本文章提供java、python、c++、jsNode四种代码
题目描述
A、B两个人把苹果分为两堆,A希望按照他的计算规则等分苹果,他的计算规则是按照二进制加法计算,并目不计算进位12+5=9 (1100 + 0101 = 9),B的计算规则是十进制加法,包括正常进位,B希望在满足A的情况下获取苹果重量最多。输入苹果的数量和每个苹果重量,输出满足A的情况下B获取的苹果总重量。
如果无法满足A的要求,输出-1。
数据范围
1 <= 总苹果数量 <= 20000
1 <= 每个苹果重量 <= 10000
输入描述
输出描述
示例1 输入输出示例仅供调试,后台判题数据一般不包含示例
示例2 输入输出示例仅供调试,后台判题数据一般不包含示例输入
思路:
首先将所有数转化为二进制,每位的1和0的数量都要是偶数个
也就是所有数的异或最后要为0,才能按A的方法分给两个人
不为0的数输出就是-1
为0的话,数组最小的值就是分给A的,其他都是分给B的
java代码:
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = Integer.parseInt(scanner.nextLine().trim());
String[] dataStr = scanner.nextLine().split(" ");
int[] data = new int[n];
int res = 0;
int sum = 0;
for (int i = 0; i < n; i++) {
data[i] = Integer.parseInt(dataStr[i]);
res ^= data[i];
sum += data[i];
}
Arrays.sort(data);
System.out.println(res == 0 ? sum - data[0] : -1);
}
}
python代码:
n = int(input())
str = input().split(' ')
res = 0
sum = 0
num = []
for i in range(n):
num.append(int(str[i]))
res ^= int(str[i])
sum += int(str[i])
num.sort()
if res == 0:
print(sum - num[0])
else:
print(-1)
c++代码:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin >> n;
vector<int> nums(n);
int res = 0;
int sum = 0;
for (int i=0; i<n; i++)
{
cin >> nums[i];
res ^= nums[i];
sum += nums[i];
}
sort(nums.begin(), nums.end());
cout << (res ? -1 : (sum - nums[0])) << endl;
return 0;
}
JsNode代码:
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
let n;
rl.on('line', line => {
str=line.split(" ")
if (!n) {
n=str[0];
}else{
a=new Array(n);
let res=0,sum=0;
for(let i=0;i<n;i++){
a[i]=+str[i];
res^=+str[i];
sum+=a[i];
}
a.sort((x,y)=>x-y)
console.log(res==0?sum-a[0]:-1)
}
});