Shoemaker’s Problem

и задачки для интервью.
User avatar
IvanGrozniy
Уже с Приветом
Posts: 10379
Joined: 04 Feb 2004 14:14
Location: Edgewater, NJ

Shoemaker’s Problem

Post by IvanGrozniy »

Есть задача:
A shoemaker has N orders from customers which he must satisfy. The shoemaker can
work on only one job in each day, and jobs usually take several days. For the ith job,
the integer Ti (1 ≤ Ti ≤ 1, 000) denotes the number of days it takes the shoemaker to
finish the job.
But popularity has its price. For each day of delay before starting to work on the ith
job, the shoemaker has agreed to pay a fine of Si (1 ≤ Si ≤ 10, 000) cents per day. Help
the shoemaker by writing a program to find the sequence of jobs with minimum total fine.

Input
The input begins with a single positive integer on a line by itself indicating the number
of the test cases, followed by a blank line. There is also a blank line between two
consecutive cases.
The first line of each case contains an integer reporting the number of jobs N, where
1 ≤ N ≤ 1, 000. The ith subsequent line contains the completion time Ti and daily
penalty Si for the ith job.

Output
For each test case, your program should print the sequence of jobs with minimal fine.
Each job should be represented by its position in the input. All integers should be placed
on only one output line and each pair separated by one space. If multiple solutions are
possible, print the first one in lexicographic order.
The output of two consecutive cases must be separated by a blank line.

Sample Input
1
4
3 4
1 1000
2 2
5 5

Sample Output
2 1 3 4


На ум приходит только одно возможное решение - перебрать всевозможные комбинации, что не приемлимо, так как заказов может быть 1000, программа не справится с таким огромным количеством операций.
Есть подсказка использовать сортировку, возможно по нескольким полям
Does it help to sort jobs by their length, or by their penalty, or both?

Чего-то подсказка не очень-то и помогает мне.
Есть идеи?
DanielMa
Уже с Приветом
Posts: 10188
Joined: 12 Aug 2002 16:13
Location: NYC

Post by DanielMa »

Выполнение какой то работы, откладывает все остальные на Тi. Для каждой работы мы можем посчитать на сколько она увеличивает штраф за все остальные работы.

То есть при выборе первой работы, мы выбираем ту которая дает найменьшее сумму увеличения штрафов.
User avatar
mikeG
Уже с Приветом
Posts: 8470
Joined: 02 Aug 2003 01:32
Location: SPb->SFBA

Post by mikeG »

На входе имеем некую последовательность O={Ti, Si}.

Для каждой такой последовательности можем вычислить суммарную penalty P(O). Цель - ее минимизировать с помощью сортировки.

Можно попробовать сортировать по типу пузырька:
двигаемся по списку работ и переставляем работу вперед, если P уменьшается: P(O1) >= P(O2) >=... P(ON-1).

Вычислять на каждом шагу P целиком не обязательно. Достаточно разности P(Oj+1)-P(Oj).

Всего делаем N проходов по списку - все должно отсортироваться в правильном порядке.
vaduz
Уже с Приветом
Posts: 27652
Joined: 15 Jul 2002 17:05
Location: MD

Post by vaduz »

Сдается мне, что работы можно просто отсортировать по весу, который вычисляется так: Wi=Si/Ti
User avatar
IvanGrozniy
Уже с Приветом
Posts: 10379
Joined: 04 Feb 2004 14:14
Location: Edgewater, NJ

Post by IvanGrozniy »

...
Last edited by IvanGrozniy on 31 Mar 2008 20:53, edited 1 time in total.
User avatar
IvanGrozniy
Уже с Приветом
Posts: 10379
Joined: 04 Feb 2004 14:14
Location: Edgewater, NJ

Post by IvanGrozniy »

mikeG wrote:На входе имеем некую последовательность O={Ti, Si}.

Для каждой такой последовательности можем вычислить суммарную penalty P(O). Цель - ее минимизировать с помощью сортировки.

Можно попробовать сортировать по типу пузырька:
двигаемся по списку работ и переставляем работу вперед, если P уменьшается: P(O1) >= P(O2) >=... P(ON-1).

Вычислять на каждом шагу P целиком не обязательно. Достаточно разности P(Oj+1)-P(Oj).

Всего делаем N проходов по списку - все должно отсортироваться в правильном порядке.

Количество последовательностей N!, что не приемлимо, если есть список из 1000 работ, как я указал ранее, компьютер зависнет.
User avatar
IvanGrozniy
Уже с Приветом
Posts: 10379
Joined: 04 Feb 2004 14:14
Location: Edgewater, NJ

Post by IvanGrozniy »

vaduz wrote:Сдается мне, что работы можно просто отсортировать по весу, который вычисляется так: Wi=Si/Ti

А как объяснить, что можно применить вес?
User avatar
mikeG
Уже с Приветом
Posts: 8470
Joined: 02 Aug 2003 01:32
Location: SPb->SFBA

Post by mikeG »

"1 1000" - вторая, а не третья.
Там в условии что-то про "test cases" - это я не понял.
Видимо, можно несколько последовательностей в одном файле хранить?
Во второй строчке - количество работ (N), а следующие строчки - сами работы с 1 по N.
User avatar
IvanGrozniy
Уже с Приветом
Posts: 10379
Joined: 04 Feb 2004 14:14
Location: Edgewater, NJ

Post by IvanGrozniy »

DanielMa wrote:Выполнение какой то работы, откладывает все остальные на Тi. Для каждой работы мы можем посчитать на сколько она увеличивает штраф за все остальные работы.

То есть при выборе первой работы, мы выбираем ту которая дает найменьшее сумму увеличения штрафов.

Похоже на правду. Количество операций O(n^3).
Есть ли ошибка в данном подходе?
User avatar
mikeG
Уже с Приветом
Posts: 8470
Joined: 02 Aug 2003 01:32
Location: SPb->SFBA

Post by mikeG »

IvanGrozniy wrote:
mikeG wrote:Всего делаем N проходов по списку - все должно отсортироваться в правильном порядке.

Количество последовательностей N!, что не приемлимо, если есть список из 1000 работ, как я указал ранее, компьютер зависнет.


N! - это тупой перебор. Сортировка пузырьком - это O(N^2).
То, что DanielMa предлагает - тот же N^2.
Видимо, можно и более продвинутую сортировку с O(N*log(N)) задвинуть.
User avatar
IvanGrozniy
Уже с Приветом
Posts: 10379
Joined: 04 Feb 2004 14:14
Location: Edgewater, NJ

Post by IvanGrozniy »

mikeG wrote:То, что DanielMa предлагает - тот же N^2.

Ну как же? Взял первый элемент, поситал штраф (n) + отсортировал O(n^2), взял второй элемент, посчитал штраф (n - 1) + отсортировал O((n - 1)^2) и т.д.
Видно, что количество операций больше O(n^2).
Точнее n(n -1)(n-2)...O(n^2) * O((n - 1)^2)... меньше O(n^3) и больше O(n^2)
Не вижу ошибки в моей оценке.
User avatar
mikeG
Уже с Приветом
Posts: 8470
Joined: 02 Aug 2003 01:32
Location: SPb->SFBA

Post by mikeG »

Если штраф целиком вычислять для каждой работы на каждом шаге, то n^3 получится.
Но целиком не нужно. Нужна его разность с штрафами для других работ.
vaduz
Уже с Приветом
Posts: 27652
Joined: 15 Jul 2002 17:05
Location: MD

Post by vaduz »

IvanGrozniy wrote:
vaduz wrote:Сдается мне, что работы можно просто отсортировать по весу, который вычисляется так: Wi=Si/Ti

А как объяснить, что можно применить вес?


Сначала очевидные утверждения:
- если работы одинаковой длительности, то вес Wi~Si
- если работы с одинаковым штрафом, то вес Wi ~1/Ti

Рабочая гипотеза: если параметров для вариации всего два, то вес Wi~Si/Ti

BTW, это просто другими словами изложено предложение DanielMa.
User avatar
IvanGrozniy
Уже с Приветом
Posts: 10379
Joined: 04 Feb 2004 14:14
Location: Edgewater, NJ

Post by IvanGrozniy »

mikeG wrote:Но целиком не нужно. Нужна его разность с штрафами для других работ.

А поподробней можно? Почему не нужно? По-моему все равно надо для последней работы посчитать n-1 раз.
vaduz
Уже с Приветом
Posts: 27652
Joined: 15 Jul 2002 17:05
Location: MD

Post by vaduz »

BTW, это просто другими словами изложено предложение DanielMa.

Я ошибся, это не так...
User avatar
venco
Уже с Приветом
Posts: 2001
Joined: 10 Nov 2004 00:34
Location: MD

Post by venco »

Если взять два соседних элемента из оптимальной конфигурации, то их перестановка не влияет на штраф остальных элементов, значит любые два соседних элемента должны быть расположены так, чтобы минимизировать их собственный штраф. А это достигается, если первым поставить тот, у которого отношение T/S меньше. Т.е. надо просто все элементы отсортировать по возрастанию отношения Ti/Si.
User avatar
IvanGrozniy
Уже с Приветом
Posts: 10379
Joined: 04 Feb 2004 14:14
Location: Edgewater, NJ

Post by IvanGrozniy »

venco wrote:Если взять два соседних элемента из оптимальной конфигурации, то их перестановка не влияет на штраф остальных элементов, значит любые два соседних элемента должны быть расположены так, чтобы минимизировать их собственный штраф. А это достигается, если первым поставить тот, у которого отношение T/S меньше. Т.е. надо просто все элементы отсортировать по возрастанию отношения Ti/Si.

Теперь понятно, спасибо.

Return to “Головоломки”