manzanas divididas
A y B dividen las manzanas en dos montones. A quiere dividir las manzanas en partes iguales de acuerdo con su regla de cálculo. Su regla de cálculo es calcular de acuerdo con la suma binaria, y no calcula el acarreo 12+5=9 (1100 + 0101 = 9), la regla de cálculo de B es la suma decimal, incluido el acarreo normal, y B espera obtener el mayor peso de manzanas cuando A esté satisfecho.
Ejemplo 1:
Hay 3 manzanas con pesos 12, 5 y 9. Entonces, de acuerdo con los requisitos del título, la mejor manera de dividir es: A obtiene dos manzanas con pesos de 12 y 5, y B obtiene una manzana con un peso de 9. En este momento, solo cumple con los requisitos de B: los pesos de las dos manzanas obtenidas por A son 12 y 5. El número binario de 12 es 1100 y el número binario de 5 es 0101. La suma de estos dos números binarios ignorando el acarreo es igual a 1001. Para el número decimal, es 9, que es exactamente el peso de la manzana asignado por B.
Ejemplo 2:
Hay 3 manzanas con pesos 3, 5 y 6. Entonces, de acuerdo con los requisitos del título, la mejor manera de dividir es: A obtiene dos manzanas con pesos 5 y 6, y B obtiene una manzana con un peso de 3. En este momento, solo cumple con los requisitos de B: los pesos de las dos manzanas obtenidas por A son 5 y 6, el número binario de 5 es 0101 y el número binario de 6 es 0110. La suma de estos dos números binarios ignorando el acarreo es igual a 0011, y la conversión El número decimal es 3, que es exactamente el peso de la manzana que obtiene B.
código
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);
});
optimizado
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);
});