Algoritmo de encuentro: división de manzanas

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);
});

Supongo que te gusta

Origin juejin.im/post/7120929832208171038
Recomendado
Clasificación