Перша головоломка від мене, пропозиції щодо вдосконалення з радістю отримали!
Сценарій такий; Ви працюєте менеджером по рафтинговій компанії. Щоранку вам подають список бронювання, і вам доведеться сортувати їх за плотними навантаженнями. Напишіть програму або функцію на обраній вами мові, яка робить це за вас.
Кожен пліт має максимум n
клієнтів, і кожне бронювання призначене для групи від 1 до n
людей (включно). Необхідно дотримуватися наступних правил;
Жодна група не може бути розділена. Якщо вони забронювали разом, вони повинні бути на одному плоті.
Кількість плотів необхідно мінімізувати.
При дотриманні двох попередніх правил групи повинні бути розподілені якомога рівномірно між плотами.
Вхідні дані.
Кількість n
(ви можете припустити, що це натуральне число) та розмір усіх бронювання. Це може бути масив, список або подібна структура даних, якщо ваша мова підтримує такі речі. Усі ці натуральні числа будуть від 1 до n
. Порядок бронювання не визначений, не важливий.
Вихідні дані. Перелік номерів бронювання, згрупований у плоскі вантажі. Групування повинно бути зазначено однозначно, наприклад;
- список або масив масивів.
- список, розділений комами, для кожного плоту. Нова лінія між кожним плотом.
Як ви реалізуєте третє правило, залежати від вас, але це може включати пошук середньої кількості плотів та мінімізацію відхилень від нього. Ось кілька тестових випадків.
n Bookings Output
6 [2,5] [5],[2]
4 [1,1,1,1,1] [1,1,1],[1,1]
6 [2,3,2] [2,2],[3]
6 [2,3,2,3] [2,3],[2,3]
6 [2,3,2,3,2] [2,2,2],[3,3]
12 [10,8,6,4,2] [10],[8,2],[6,4]
6 [4,4,4] [4],[4],[4]
12 [12,7,6,6] [12],[7],[6,6]
Діють стандартні правила, виграє найкоротший код. Веселіться!
Відредаговано; Запропонований спосіб визначити якомога рівномірніше третього правила.
Після того, як буде визначено кількість плотів r
(з урахуванням другого правила), середня розміщеність a
може бути розрахована шляхом підсумовування бронювання та поділу на r
. Для кожного плоту відхилення від середньої зайнятості можна знайти, використовуючи d(x) = abs(n(x)-a)
, де n(x)
кількість людей на кожному плоті та 1 <= x <= r
. Для деякої безперервної однозначної функції f(y)
, яка є строго позитивною і має строго позитивну першу і негативну другу похідні для всіх позитивних y
, ми визначаємо негативну величину F
як суму всіх значень f(d(x)), 1 <= x <= r
. Будь-який вибір розподілу плотів, який відповідає першим двом правилам, і де F
дорівнює глобальному мінімуму, задовольняє і третє правило.
g(y) = y
(другий похідний нуль) або g(y) = y²
(перший дервіровать нуль, коли y = 0
), хоча.