分割されたリンゴ
AとBは、リンゴを2つの山に分割します。Aは、計算規則に従ってリンゴを均等に分割したいと考えています。彼の計算規則は、2進数の加算に従って計算することであり、キャリー12 + 5 = 9(1100 + 0101 = 9)、Bの計算規則は、通常のキャリーを含む10進数の加算であり、Bは、Aが満たされたときにリンゴの重量を最大にすることを望んでいます。
例1:
重さ12、5、9のリンゴが3つあります。次に、タイトルの要件に従って、分割する最良の方法は次のとおりです。Aは重み12と5の2つのリンゴを取得し、Bは重み9のリンゴを取得します。現時点では、Bの要件を満たしています。Aによって取得された2つのリンゴの重量は12と5です。12の2進数は1100、5の2進数は0101です。これら2つの2進数の合計キャリーを無視すると1001になります。10進数の場合は9で、これはBによって割り当てられたリンゴの重量とまったく同じです。
例2:
重さ3、5、6のリンゴが3つあります。次に、タイトルの要件に従って、分割する最良の方法は次のとおりです。Aは重み5と6の2つのリンゴを取得し、Bは重み3のリンゴを取得します。現時点では、Bの要件を満たしています。Aによって取得された2つのリンゴの重量は5と6で、2進数の5は0101、2進数の6は0110です。これら2つの2進数の合計キャリーを無視すると0011に等しく、変換10進数は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);
});