tło
Wyobraź sobie przez chwilę, że masz nudną i nudną pracę. Każdego ranka dostajesz zestaw zadań, które powinieneś wykonać tego dnia. Każde zadanie ma określony czas trwania i po uruchomieniu musi zostać wykonane za jednym razem. Twój szef nie będzie tolerował pracy na biegu jałowym, więc jeśli są jeszcze zadania, które możesz wykonać przed powrotem do domu, musisz popracować nad jednym z nich (możesz wybrać, który z nich). I odwrotnie, jeśli wszystkie pozostałe zadania wymagałyby pracy w godzinach nadliczbowych, musisz wrócić do domu wcześniej! Dlatego Twoim celem jest zminimalizowanie długości dnia roboczego poprzez sprytne planowanie.
Ciekawostka: jest to jeden z wariantów leniwego biurokratycznego problemu planowania i jest trudny do rozwiązania ( źródło ).
Wejście
Masz dwa dane wejściowe: liczbę „jednostek czasu” w dniu roboczym (dodatnia liczba całkowita L
) oraz zbiór zadań (niepusta tablica dodatnich liczb całkowitych T
reprezentujących czas trwania zadania). Można je pobierać w dowolnej kolejności i w dowolnym rozsądnym formacie. Tablica T
może zawierać zadania o czasie trwania dłuższym niż L
, ale z pewnością zawiera co najmniej jedno zadanie o czasie trwania L
.
Wynik
Poprawny harmonogram jest podzbiorem zadania S ⊆ T
takie, że sum(S) ≤ L
, i każde zadanie nie w S
(krotności liczenia) ma długość ponad surowo L - sum(S)
. Twój wynik będzie najmniejszą możliwą sumą prawidłowego harmonogramu. Innymi słowy, podasz minimalną liczbę jednostek czasu, które musisz dziś pracować.
Przykład
Rozważ dane wejściowe
L = 9
T = [3,4,4,4,2,5]
Jednym ze sposobów planowania dnia jest [4,4]
: ukończenie dwóch zadań w 8 jednostkach czasu i pozostanie 1 jednostka. Ponieważ żadne zadania jednoczęściowe nie są dostępne, możesz wrócić do domu. Jednak harmonogram [2,5]
jest jeszcze lepszy: pracujesz przez 7 jednostek czasu, a następnie wszystkie pozostałe zadania zajęłyby 3 lub więcej jednostek czasu. Harmonogram [2,4]
nie jest prawidłowy, ponieważ po przepracowaniu 6 jednostek czasu nadal będziesz mieć wystarczająco dużo czasu, aby ukończyć zadanie 3 jednostek. 7 jednostek okazuje się optymalnych, więc poprawna wydajność to 7
.
Zasady i punktacja
Możesz napisać pełny program lub funkcję. Wygrywa najniższa liczba bajtów, a standardowe luki są niedozwolone. Nie ma ograniczeń czasowych, więc brutalne zmuszanie jest całkowicie dopuszczalne.
Przypadki testowe
Są one podane w formacie L T -> output
.
1 [1,2] -> 1
6 [4,1] -> 5
7 [7,7,9] -> 7
9 [3,4,4,4,2,5] -> 7
20 [6,2,3,12,7,31] -> 17
42 [7,7,7,7,8,8,8] -> 36
42 [7,7,7,7,7,8,8,8] -> 35
42 [7,7,7,7,7,7,8,8,8] -> 36
16 [1,2,3,4,5,6,7,8,9,10] -> 13
37 [15,27,4,1,19,16,20,26,29,18] -> 23
22 [24,20,8,8,29,16,5,5,16,18,4,9] -> 18
80 [10,22,11,2,28,20,27,6,24,9,10,6,27,2,15,29,27] -> 71
59 [26,28,5,4,7,23,5,1,9,3,7,15,4,23,7,19,16,25,26] -> 52