偶遇算法-分苹果

分苹果

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

猜你喜欢

转载自juejin.im/post/7120929832208171038