Historia
„2016? W porządku…” - narzekał sprzedawca zabawek Hilbert. Otworzył oczy, wytarł z ucha ściekający sos sałatkowy i zjadł cremeschnitte rano. Przykładowe wakacje. Teraz jednak musi iść do pracy i dokończyć księgowość roku.
Boże Narodzenie to bardzo owocny okres roku, szczególnie ze względu na sprzedaż. Hilbert wie dokładnie, jak to działa: osoba wchodzi do sklepu i kupuje jej pierwszy prezent. Płacą za to i uciekają do innego sklepu. W praktyce to, czym tak naprawdę jest prezent, tak naprawdę nie robi różnicy. Cena jest również nieistotna, pod warunkiem że nie jest zbyt wysoka. Wszystko zależy od czasu pozostałego do Bożego Narodzenia - im krótszy czas, tym większe wyrzuty sumienia klientów, tym wyższa cena, jaką są skłonni zapłacić.
Wystarczy spojrzeć na zegarek - Hilbert i od razu wie, ile mogą wydać jego klienci. Może z łatwością skorzystać z tego faktu: po prostu znajduje najdroższy prezent, który może sprzedać danemu klientowi i mu go zaoferować. Dopiero teraz zdał sobie sprawę, że w ubiegłym roku zapomniał zastosować tę przebiegłą strategię. To się jednak zmieni!
Niemniej jednak Hilbert chciałby wiedzieć, jak bardzo rozkwitłby jego interes, gdyby rzeczywiście wykorzystał swój wielki plan. Udało mu się zebrać listę osób, które przyszły do jego sklepu, jednak nie jest pewien, ile pieniędzy mógł na nich zarobić.
Twoje zadanie (TL; DR)
Wejście składa się z rosnąco listę cen dostępnych prezentów oraz listę budżetów klientów. Lista budżetów jest w tej samej kolejności, w jakiej klienci przybyli do sklepu - pod warunkiem, że każdy klient jest skłonny zapłacić co najmniej tyle, co poprzedni, co oznacza, że również rośnie.
Dla każdego klienta znajdź najdroższy prezent, za który jest gotów zapłacić, i wydrukuj jego cenę. Jeśli żadne prezenty w ramach budżetu nie są dostępne, należy wyprowadzić wynik 0
.
Otrzymasz -40%
premię dla postaci, jeśli asymptotyczna złożoność czasowa twojego algorytmu jest O(n+m)
(a nie trywialna O(n*m)
) Gdzie n, m
są długości list wejściowych.
To jest golf golfowy , wygrywa najkrótsza bajt. Standardowe luki są zabronione.
Przykład
Wejście:
1 2 2 2 5 7 10 20
1 1 2 3 6 6 15 21 21 22
Wynik:
1 0 2 2 5 2 10 20 7 0
To zadanie zostało wzięte z lokalnego konkursu programistycznego i przetłumaczone przeze mnie na język angielski. Oto oryginalne zadanie: https://www.ksp.sk/ulohy/zadania/1131/
Odpowiedzi:
Pyth,
1716 bajtów1 bajt dzięki Pietu1998
Demonstracja
Wyjaśnienie:
źródło
VE=.-Q]
\ ne|fgNTQ0
. Zasadniczo to samo, ale z pętlą.Haskell, 67 bajtów
Przykład użycia:
[1,2,2,2,5,7,10,20] # [1,1,2,3,6,6,15,21,21,22]
->[1,0,2,2,5,2,10,20,7,0]
.Podziel ceny na dwie części:
(h,t)
gdzieh
wszystkie ceny <= budżet następnego klienta it
wszystkie pozostałe. Weź ostatnią cenęh
i kontynuuj rekurencyjnie ze wszystkimi oprócz ostatniegoh
plusat
i pozostałych budżetów.last(0:h)
ocenia,0
czyh
jest pusty. Podobne:init (h++[0|h==[]]) ++ t
dodaje element fikcyjny0
doh
ifh
jest pusty, więcinit
ma coś do upuszczenia (init
nie działa na pustej liście).źródło
Java, 154 * 0,6 = 92,4 bajtów
-13 bajtów, ponieważ lambda może faktycznie użyć
int[]
, nieInteger[]
(dzięki BunjiquoBianco )Powinno to zająć czas O (n + m) i dodatkową przestrzeń O (n + m) (zakładając, że rozumiem dużą notację O) .
Wcięte: ( Wypróbuj online! )
Pokazuję tutaj rozszerzenie inne niż lambda, ponieważ deklaracja typu jest czystsza i ma dokładnie taką samą logikę. Lambda jest obecna na łączu ideonu.
Wyjaśnienie:
Zastosowane zmienne:
g
to lista cen prezentów,b
to lista budżetów.gl
jest długościąg
ibl
jest długościąb
.a
to stos niedrogich prezentów,s
to tablica wyników sprzedanych prezentów.gp
,bp
Iap
są wskaźnikami dlag
,b
ia
odpowiednio.bp
jest również wskaźnikiem dlas
.Algorytm:
g[gp]
a
i zwiększajgp
a
w przeciwnyms[bp]
razie0
.źródło
(g,b)->
dog->b->
?int
), musiałem użyć tablicy typów referencyjnych. Ale mogę użyć tablicy int w porządku. Będę aktualizować, gdy będę mieć szansę.Haskell, 87 * 0,6 = 52,2 bajtów
Zupełnie różni się od mojej innej odpowiedzi , ponieważ idę po premię.
Ostatni wiersz (->
g[]
) nie jest częścią definicji, ale wywołuje narzut. Przykład użycia:g [] [1,2,2,2,5,7,10,20] [1,1,2,3,6,6,15,21,21,22]
->[1,0,2,2,5,2,10,20,7,0]
.Działa w zasadzie w taki sam sposób, jak odpowiedź @ CAD97 , tzn. Używa (początkowo pustego) stosu pomocników do śledzenia przedmiotów do kupienia. Szczegółowo: sprawdź w kolejności:
Działa to w
m+n
czasie, ponieważ a) operacje na stosie pomocniczym używają stałego czasu ib) w każdym z wywołań rekurencyjnych jedna z list jest skracana o jeden element.źródło
Galaretka , 15 bajtów
Wypróbuj online!
Jak to działa
źródło
JavaScript, 85 * 0,6 = 51 bajtów
Kolejny klon odpowiedzi @ CAD97.
źródło