Для каждой ячейки известна её оставшаяся до потолка 1 «ёмкость».
Сложить ёмкости
= capacity
вместимость всего массива.
Если
X > capacity
— «невпихуемо!» — задача не имеет решения.
Коэффициент
k = X / capacity
меньше или равен 1.
Идти по ячейкам, откусывать от X в очередную кусочек, пропорционально ёмкости этой ячейки с коэфф.
k
.
Так в каждую доложат пропорционально её ёмкости, сглаживая неравномерность заполнения.
шесть строк на JSconst spread = (value, arr) => {
const CELL_MAX = 1;
const sum = arr.reduce((acc, c) => acc + c);
const capacity = arr.length * CELL_MAX - sum;
if (value > capacity) throw new Error("Value won't fit");
const k = value / capacity;
return arr.map(el => el + (CELL_MAX - el) * k);
}
spread(0.2, [ 0.1, 0.1 ]) // [ 0.2, 0.2 ]
spread(0.2, [ 0.1, 0.99 ]) // [ 0.29780219780219785, 0.9921978021978022 ]