Задать вопрос
k12th
@k12th
console.log(`You're pulling my leg, right?`);

Как расставить шесть чисел так, чтобы сумма первых трех была примерно равна сумме остальных?

Стоит задача красиво нарисовать кольцевую диаграмму. Диаграмма всегда состоит из шести секторов; справа и слева — по тре легенды с указателями. Соответственно, чтобы это все было более-менее симметрично, надо скормить библиотеке, отвечающей за рендер диаграммы, данные в правильном порядке. То есть, чтобы (a0 + a1 + a2) - (a3 + a4 + a5) было минимальным из всех возможных.

Можно было бы просто перебрать все возможные перестановки массива из шести элементов, но это, ЕМНИП, 6! == 720 перестановок, а дело происходит в браузере, в JS, и в таком месте, где тормоза никак не допустимы.

Сумма чисел будет равна, очевидно, 100 (ибо 100%).
  • Вопрос задан
  • 3446 просмотров
Подписаться 2 Оценить Комментировать
Решения вопроса 2
@vans239
Что-то вы преувеличили количество необходимых перестановок. Выбор левой тройки однозначно определяет выбор правой тройки (а также ее сумму). Поэтому всего необходимо перебрать 6!/(3!*3!) = 20. А это уже мало
Ответ написан
Bringoff
@Bringoff
Android dev at Freelance
Частное от задачи о двух кучах камней - распространенной на олимпиадах как представитель динамического программирования. Неплохо расписано здесь, но вряд ли шкурка стоит вычинки. Проще раскидать приблизительно - кидаем самый большой кусок на одну кучу. Если меньше 50%, докидываем самых маленьких. На этапе, когда станет больше 50% возвращаемся на шаг назад. Либо не возврашаемся, если не намного больше. Остальное уходит во вторую "кучу"
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Отсортировать и взять в первую выборку четные элементы, а во вторую - нечетные. Не факт, что это даст лучший результат, но просто, быстро и первое, что приходит на ум.

Результат будет ближе к нужному, если в каждый набор брать по очереди сначала четный элемент, потом нечетный. Допустим, есть отсортированный набор: 1,2,3,4,5,6.

Берем: (1, 4, 5), (2,3,6). Это уже лучше, чем (1, 3, 5), (2, 4, 6). Так как мы не берем каждый раз в набор с четными элементами заведомо больший элемент, а чередуем.

Если числа в сумме дают что-то определенное (100 или 1, например), то можно попробовать реализовать направленный поиск набора, наиболее близкого к половине от суммы.
Ответ написан
Mrrl
@Mrrl
Заводчик кардиганов
Отсортировать в порядке убывания, потом первые два элемента положить в разные кучки, а каждый следующий - в ту из кучек, где сумма на данный момент меньше. Работать будет не всегда (например, 25,25,20,20,9,1), зато не требует перебора.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы