分苹果
A、B 两个人把苹果分为两堆,A 希望按照他的计算规则等分苹果,他的计算规则是按照二进制加法计算,并且不计算进位 12+5=9(1100 + 0101 = 9),B 的计算规则是十进制加法,包括正常进位,B 希望在满足 A 的情况下获取苹果重量最多。
例子 1:
有 3 个苹果,重量分别为 12、5、9。那么按照题目的要求,最好的分法是:A 获得重量为 12、5 的两个苹果,B 获得重量为 9 的苹果。此时刚好满足 B 的要求——A 所分得的两个苹果的重量 12 和 5,12 的二进制数为 1100,5 的二进制数为 0101,这两个二进制数忽略进位的和等于 1001,转化为十进制数即为 9,刚好是 B 所分得的苹果的重量。
例子 2:
有 3 个苹果,重量分别为 3、5、6。那么按照题目的要求,最好的分法是:A 获得重量为 5、6 的两个苹果,B 获得重量为 3 的苹果。此时刚好满足 B 的要求——A 所分得的两个苹果的重量 5 和 6,5 的二进制数为 0101, 6 的二进制数为 0110,这两个二进制数忽略进位的和等于 0011,转化为十进制数即为 3,刚好是 B 所分得的苹果的重量。
代码
function cutApple(s) {
const list = s.split(' ');
const len = list.length;
if (len === 1) {
console.log(-1);
} else {
const total = list.reduce((a, b) => Number(a) + Number(b));
let result = -1;
const dfs = (level, sum, xor) => {
if (level === list.length) {
const diff = total - sum;
if (diff === xor && level !== 0 && diff !== 0) {
result = Math.max(result, sum);
}
return;
}
dfs(level + 1, sum + Number(list[level]), xor ^ Number(list[level]));
dfs(level + 1, sum, xor);
};
dfs(0, 0, 0);
console.log('result', result);
}
}
var testList = ['3 5 6', '7258 6579 2602 6716 3050 3564 5396 1773', '12 5 9'];
testList.forEach((v) => {
cutApple(v);
});
优化版
function cutApple(s) {
const list = s.split(' ');
const len = list.length;
if (len === 1) {
console.log(-1);
} else {
let c = 0;
for (let i = 0; i < list.length; i++) {
c = c ^ Number(list[i]);
}
if (c === 0) {
list.sort((a, b) => Number(a) - Number(b));
const t = list.reduce((a, b) => Number(a) + Number(b));
console.log(t - list[0]);
} else {
console.log(-1);
}
}
}
var testList = ['3 5 6', '7258 6579 2602 6716 3050 3564 5396 1773', '12 5 9'];
//var testList = ['3 5 6', '12 5 9'];
testList.forEach((v) => {
cutApple(v);
});