DM
Size: a a a
DM
DM
🌬М
C
function split(array) {
const sum = ar => ar.reduce((x,y) => x + y, 0);
const desc = (a, b) => b - a;
let a = [], b = [];
let sums = new Map();
sums.set(a, 0);
sums.set(b, 0);
let sorted = [...array].sort(desc);
while (sorted.length) {
let el = sorted.shift();
let rest = sum(sorted);
// всё в а - а+э+рест меньше или равно б
if (sums.get(a) + el + rest <= sums.get(b)) {
a.push(el, ...sorted);
sorted.length = 0;
break;
}
// всё в б - б+э+рест меньше или равно а
if (sums.get(b) + el + rest <= sums.get(a)) {
b.push(el, ...sorted);
sorted.length = 0;
break;
}
// э в а - а+э меньше или равно б
if (sums.get(a) <= sums.get(b)) {
a.push(el);
sums.set(a, sums.get(a) + el);
} else {
// э в б - б+э меньше или равно а
b.push(el);
sums.set(b, sums.get(b) + el);
}
}
return [a, b];
}
DM
DM
AA
🌬М
function split(array) {
const sum = ar => ar.reduce((x,y) => x + y, 0);
const desc = (a, b) => b - a;
let a = [], b = [];
let sums = new Map();
sums.set(a, 0);
sums.set(b, 0);
let sorted = [...array].sort(desc);
while (sorted.length) {
let el = sorted.shift();
let rest = sum(sorted);
// всё в а - а+э+рест меньше или равно б
if (sums.get(a) + el + rest <= sums.get(b)) {
a.push(el, ...sorted);
sorted.length = 0;
break;
}
// всё в б - б+э+рест меньше или равно а
if (sums.get(b) + el + rest <= sums.get(a)) {
b.push(el, ...sorted);
sorted.length = 0;
break;
}
// э в а - а+э меньше или равно б
if (sums.get(a) <= sums.get(b)) {
a.push(el);
sums.set(a, sums.get(a) + el);
} else {
// э в б - б+э меньше или равно а
b.push(el);
sums.set(b, sums.get(b) + el);
}
}
return [a, b];
}
C
function split(array) {
const sum = ar => ar.reduce((x,y) => x + y, 0);
const desc = (a, b) => b - a;
let a = [], b = [];
let sums = new Map();
sums.set(a, 0);
sums.set(b, 0);
let sorted = [...array].sort(desc);
while (sorted.length) {
let el = sorted.shift();
let rest = sum(sorted);
// всё в а - а+э+рест меньше или равно б
if (sums.get(a) + el + rest <= sums.get(b)) {
a.push(el, ...sorted);
sorted.length = 0;
break;
}
// всё в б - б+э+рест меньше или равно а
if (sums.get(b) + el + rest <= sums.get(a)) {
b.push(el, ...sorted);
sorted.length = 0;
break;
}
// э в а - а+э меньше или равно б
if (sums.get(a) <= sums.get(b)) {
a.push(el);
sums.set(a, sums.get(a) + el);
} else {
// э в б - б+э меньше или равно а
b.push(el);
sums.set(b, sums.get(b) + el);
}
}
return [a, b];
}
DM
🌬М
function split(array) {
const sum = ar => ar.reduce((x,y) => x + y, 0);
const desc = (a, b) => b - a;
let a = [], b = [];
let sums = new Map();
sums.set(a, 0);
sums.set(b, 0);
let sorted = [...array].sort(desc);
while (sorted.length) {
let el = sorted.shift();
let rest = sum(sorted);
// всё в а - а+э+рест меньше или равно б
if (sums.get(a) + el + rest <= sums.get(b)) {
a.push(el, ...sorted);
sorted.length = 0;
break;
}
// всё в б - б+э+рест меньше или равно а
if (sums.get(b) + el + rest <= sums.get(a)) {
b.push(el, ...sorted);
sorted.length = 0;
break;
}
// э в а - а+э меньше или равно б
if (sums.get(a) <= sums.get(b)) {
a.push(el);
sums.set(a, sums.get(a) + el);
} else {
// э в б - б+э меньше или равно а
b.push(el);
sums.set(b, sums.get(b) + el);
}
}
return [a, b];
}
AG
AM
C
function partition(array, mask) {
let a = [], b = [], i = array.length;
while (--i >= 0) {
if ((mask >> i) & 1) a.push(array[i]);
else b.push(array[i]);
}
return [a, b];
}
function sum(array) {
let result = 0, l = array.length;
while (--l >= 0) result += array[l];
return result
}
function split(array) {
let len = array.length;
let i = 2 ** len;
let results = [];
let min = Infinity, minidx = 0;
while (--i >= 0) {
let [a, b] = partition(array, i);
let diff = Math.abs(sum(a) - sum(b))
if (diff < min) {
if (diff === 0) return [a, b];
min = diff;
minidx = i;
}
results[i] = [a, b];
}
return results[minidx];
}
D
AM
AG
AG
AM
DM
function solve(arr) {
const sum = arr.reduce((acc, cur) => acc+cur, 0)
function take(set1, set2, set1sum, set2sum) {
let result = { set1, set2, set1sum, set2sum }
for (let i=0; i<set1.length; i++) {
const x = set1[i]
const _set1 = [...set1.slice(0, i), ...set1.slice(i + 1)]
const _set2 = [...set2, x]
const r = take(_set1, _set2, set1sum - x, set2sum + x)
if (Math.abs(r.set1sum - r.set2sum) < Math.abs(set1sum - set2sum)) {
result = r
}
}
return result
}
return take(arr, [], sum, 0, sum)
}
const result = solve([8, 7, 6, 5, 4])
console.log(result)