Die Geschichte
"2016? Alles klar", grummelte Spielzeugverkäufer Hilbert. Er öffnete die Augen, wischte sich die Salatsauce aus dem Ohr und aß morgens eine Cremeschnitte. Vorbildliche Ferien. Er muss jetzt aber zur Arbeit gehen und die Jahresabrechnung abschließen.
Weihnachten ist eine sehr ertragreiche Zeit des Jahres, vor allem für seine Verkäufe. Hilbert weiß genau, wie es geht: Eine Person kommt in einen Laden und kauft das erste Geschenk, das ihr angeboten wird. Sie bezahlen dafür und rennen zu einem anderen Geschäft. In der Praxis macht es keinen großen Unterschied, was das Geschenk eigentlich ist. Der Preis ist auch irrelevant, sofern er nicht zu hoch ist. Alles hängt von der verbleibenden Zeit bis Weihnachten ab - je kürzer die Zeit, desto größer die Reue der Kunden, desto höher der Preis, den sie zu zahlen bereit sind.
Für Hilbert reicht ein Blick auf die Uhr - und er weiß sofort, wie viel seine Kunden ausgeben können. Diese Tatsache kann er leicht ausnutzen: Er findet nur das teuerste Geschenk, das er einem bestimmten Kunden verkaufen kann, und bietet es ihm an. Erst jetzt hat er gemerkt, dass er letztes Jahr vergessen hat, diese Liststrategie anzuwenden. Das wird sich aber ändern!
Trotzdem würde Hilbert gerne wissen, wie sehr sein Geschäft gediehen wäre, wenn er tatsächlich von seinem großen Plan Gebrauch gemacht hätte. Er hat es geschafft, eine Liste der Leute zusammenzustellen, die in sein Geschäft gekommen sind, er ist sich jedoch nicht sicher, wie viel Geld er damit hätte verdienen können.
Deine Aufgabe (TL; DR)
Die Eingabe besteht aus einer aufsteigenden Preisliste der verfügbaren Geschenke und einer Liste der Kundenbudgets. Die Liste der Budgets entspricht der Reihenfolge, in der die Kunden in den Shop gekommen sind - mit der Bedingung, dass jeder Kunde bereit ist, mindestens so viel wie der vorherige zu zahlen, was bedeutet, dass auch die Reihenfolge steigt.
Finden Sie für jeden Kunden das teuerste Geschenk, für das er bereit ist zu zahlen, und geben Sie dessen Preis aus. Wenn keine Geschenke innerhalb des Budgets verfügbar sind, geben Sie a aus 0
.
Sie erhalten einen -40%
Zeichenbonus, wenn die asymptotische Zeitkomplexität Ihres Algorithmus O(n+m)
(und nicht die triviale O(n*m)
) ist. Wo n, m
sind die Längen der Eingabelisten?
Dies ist Code-Golf , kürzeste Bytes gewinnt. Standardlücken sind verboten.
Beispiel
Eingang:
1 2 2 2 5 7 10 20
1 1 2 3 6 6 15 21 21 22
Ausgabe:
1 0 2 2 5 2 10 20 7 0
Diese Aufgabe wurde von einem lokalen Programmierwettbewerb übernommen und von mir ins Englische übersetzt. Hier ist die ursprüngliche Aufgabe: https://www.ksp.sk/ulohy/zadania/1131/
Antworten:
Pyth,
1716 Bytes1 Byte danke an Pietu1998
Demonstration
Erläuterung:
quelle
VE=.-Q]
\ n speicherne|fgNTQ0
. Im Grunde das gleiche, aber mit einer Schleife.Haskell, 67 Bytes
Anwendungsbeispiel:
[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]
.Teilen Sie die Preise in zwei Teile auf:
(h,t)
Woh
sind alle Preise <= das Budget des nächsten Kunden undt
alle anderen. Nehmen Sie den letzten Preis vonh
und fahren Sie rekursiv mit allen außer dem letztenh
Plust
und den verbleibenden Budgets fort.last(0:h)
Wertet aus,0
wennh
leer ist. Ähnlich:init (h++[0|h==[]]) ++ t
Fügt ein Dummy-Element0
zuh
if hinzuh
, damitinit
etwas gelöscht werden kann (init
Fehler in der leeren Liste).quelle
Java, 154 * 0,6 = 92,4 Bytes
-13 Bytes, weil das Lambda tatsächlich verwenden kann
int[]
, nichtInteger[]
(danke BunjiquoBianco )Dies sollte O (n + m) Zeit und O (n + m) zusätzlichen Raum beanspruchen (vorausgesetzt, ich verstehe die große O-Notation) .
Eingerückt: ( Online ausprobieren ! )
Ich zeige hier die Nicht-Lambda-Erweiterung, weil die Typdeklaration sauberer ist und genau dieselbe Logik hat. Das Lambda ist an der ideone Verbindung anwesend.
Erläuterung:
Verwendete Variablen:
g
ist die Liste der Geschenkpreise,b
ist die Liste der Budgets.gl
ist die Länge vong
undbl
ist die Länge vonb
.a
ist ein Stapel für erschwingliche Geschenke,s
der Ausgabebereich für verkaufte Geschenke.gp
,bp
Undap
sind Zeiger fürg
,b
unda
jeweils.bp
ist auch der Zeiger fürs
.Algorithmus:
g[gp]
a
und erhöhen Sie esgp
a
in,s[bp]
wenn es existiert, sonst setzen0
.quelle
(g,b)->
zug->b->
?int
dass ich ein Array von Referenztypen verwenden musste , da die Typargumente Referenztypen verwenden (also nicht die Primitiven mit Werttyp ). Aber ich kann ein Array von Int ganz gut verwenden. Ich werde aktualisieren, sobald ich eine Chance habe.Haskell, 87 * 0,6 = 52,2 Bytes
Völlig anders als meine andere Antwort , weil ich für den Bonus gehe.
Die letzte Zeile (->
g[]
) ist nicht Teil der Definition, sondern ruft Overhead auf. Anwendungsbeispiel: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]
.Funktioniert im Wesentlichen wie die Antwort von @ CAD97 , dh es wird ein (anfangs leerer) Hilfsstapel verwendet, um den Überblick über die käuflichen Artikel zu behalten. Im Detail: Check in Reihenfolge:
Dies funktioniert
m+n
zeitlich, da a) Operationen auf dem Hilfsstapel eine konstante Zeit verwenden und b) in jedem der rekursiven Aufrufe eine der Listen um ein Element verkürzt wird.quelle
Gelee , 15 Bytes
Probieren Sie es online!
Wie es funktioniert
quelle
JavaScript, 85 * 0,6 = 51 Bytes
Ein weiterer Klon der Antwort von @ CAD97.
quelle