У студентки Аліси протягом наступних тижнів багато домашніх завдань. Кожен предмет домашнього завдання займає у неї рівно один день. Кожен предмет також має крайній термін і негативно впливає на його оцінки (припустимо реальну кількість, бонусні бали лише за умови, що можна порівняти), якщо вона пропустить термін.
Напишіть функцію, яка надає перелік (термін, вплив класу), визначає графік виконання домашніх завдань у той день, що мінімізує суму поганого впливу на її оцінки.
Усі домашні завдання повинні бути виконані в кінцевому підсумку, але якщо вона пропустить термін для предмета, не має значення, як пізно вона вказує.
В альтернативній рецептурі:
Корпорація ACME хоче постачати воду клієнтам. Всі вони живуть по одній горішній вулиці. ACME має кілька свердловин, розподілених по вулиці. Кожна свердловина несе достатню кількість води для одного замовника. Клієнти пропонують різні кошти для доставки. Вода стікає лише під гору. Максимізуйте дохід, вибираючи, кого замовити.
Ми можемо сортувати терміни за допомогою сортування відра (або просто припустити, що ми вже відсортовані за термінами).
Ми можемо легко вирішити проблему за допомогою жадібного алгоритму, якщо спочатку розберемо вплив за низхідним класом. Це рішення буде не кращим, ніж O (n log n).
Натхненний посередництвом медіанів і рандомізованими лінійними алгоритмами мінімального прольотного дерева , я підозрюю, що ми можемо вирішити і мою просту задачу планування / потоку в (рандомізований?) Лінійний час.
Шукаю:
- (потенційно рандомізований) лінійний алгоритм часу
- або в якості альтернативи аргументу, що лінійний час неможливий
Як трамплін:
- Я вже довів, що достатньо лише знати, які предмети можна зробити до їх терміну, для відновлення повного графіка в лінійний час. (Це розуміння лежить в основі другої рецептури, коли я прошу лише про сертифікат.)
- Проста (цілісна!) Лінійна програма може моделювати цю проблему.
- Використовуючи подвійність цієї програми, можна перевірити запропоноване кандидатом рішення у лінійний час на предмет оптимальності, якщо також буде надано рішення подвійної програми. (Обидва рішення можуть бути представлені лінійною кількістю біт.)
В ідеалі я хочу вирішити цю проблему в моделі, яка використовує лише порівняння між впливами класів, і не передбачає чисел там.
У мене є два підходи до цієї проблеми - один заснований на підробках із використанням терміну та впливу, а інший, подібний до QuickSelect, заснований на виборі випадкових елементів зведення і розподілу елементів за допомогою впливу. В обох є найгірші випадки, які змушують O (n log n) або погіршують продуктивність, але мені не вдалося побудувати простий спеціальний випадок, який погіршує продуктивність обох.