L'histoire
"2016? Très bien", grommela le vendeur de jouets Hilbert. Il ouvrit les yeux, essuya la vinaigrette à salade s'écoulant de son oreille et mangea un cremeschnitte pour le coup d'envoi du matin. Des vacances exemplaires. Il doit cependant aller travailler maintenant et terminer la comptabilité de l'année.
Noël est une période très productive de l'année, notamment pour ses ventes. Hilbert sait exactement comment cela fonctionne: une personne entre dans un magasin et achète le premier cadeau qui lui est offert. Ils paient et s'enfuient dans un autre magasin. En pratique, ce qu'est réellement le cadeau ne fait pas vraiment de différence. Le prix n'est pas non plus pertinent, à condition qu'il ne soit pas trop élevé. Tout dépend du temps restant jusqu'à Noël - plus le temps est court, plus les remords des clients sont grands, plus le prix qu'ils sont prêts à payer est élevé.
Pour Hilbert, il suffit de regarder sa montre - et il sait tout de suite combien ses clients peuvent dépenser. Il peut facilement profiter de ce fait: il trouve simplement le cadeau le plus cher qu'il peut vendre à un client donné et le leur offrir. Ce n'est que maintenant qu'il a réalisé qu'il avait oublié d'employer cette stratégie astucieuse l'année dernière. Mais ça va changer!
Néanmoins, Hilbert aimerait savoir à quel point son entreprise aurait prospéré s'il avait effectivement utilisé son grand projet. Il a réussi à dresser une liste de personnes qui sont venues dans son magasin, il n'est cependant pas sûr de combien d'argent il aurait pu gagner.
Votre tâche (TL; DR)
L'entrée consiste en une liste ascendante des prix des cadeaux disponibles et une liste des budgets des clients. La liste des budgets est dans le même ordre que les clients sont arrivés au magasin - à condition que chaque client soit prêt à payer au moins autant que le précédent, ce qui signifie qu'il est également croissant.
Pour chaque client, trouvez le cadeau le plus cher qu'il est prêt à payer et affichez son prix. Si aucun cadeau dans le budget n'est disponible, affichez a 0
.
Vous obtenez un -40%
bonus de caractères, si la complexité temporelle asymptotique de votre algorithme est O(n+m)
(plutôt que triviale O(n*m)
) Où n, m
sont les longueurs des listes d'entrée.
Il s'agit du code-golf , les octets les plus courts l'emportent. Les failles standard sont interdites.
Exemple
Contribution:
1 2 2 2 5 7 10 20
1 1 2 3 6 6 15 21 21 22
Production:
1 0 2 2 5 2 10 20 7 0
Cette tâche a été tirée d'un concours de programmation locale et traduite en anglais par mes soins. Voici la mission d'origine: https://www.ksp.sk/ulohy/zadania/1131/
Réponses:
Pyth,
1716 octets1 octet grâce à Pietu1998
Manifestation
Explication:
la source
VE=.-Q]
\ ne|fgNTQ0
. Fondamentalement la même chose mais avec une boucle.Haskell, 67 octets
Exemple d'utilisation:
[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]
.Divisez les prix en deux parties:
(h,t)
oùh
sont tous les prix <= le budget du prochain client ett
tous les autres. Prenez le dernier prix deh
et continuez récursivement avec tout sauf le dernier deh
plust
et les budgets restants.last(0:h)
évalue0
sih
est vide. Similaire:init (h++[0|h==[]]) ++ t
ajoute un élément factice0
àh
ifh
est vide, de sorte qu'ilinit
a quelque chose à supprimer (init
échoue sur la liste vide).la source
Java, 154 * 0,6 = 92,4 octets
-13 octets parce que le lambda peut réellement utiliser
int[]
, nonInteger[]
(merci BunjiquoBianco )Cela devrait prendre du temps O (n + m) et de l'espace supplémentaire O (n + m) (en supposant que je comprends la notation O) .
Indenté: ( Essayez-le en ligne! )
Je montre ici l'expansion non lambda car la déclaration de type est plus propre et c'est exactement la même logique. La lambda est présente au niveau du lien idéone.
Explication:
Variables utilisées:
g
est la liste des prix des cadeaux,b
est la liste des budgets.gl
est la longueur deg
etbl
est la longueur deb
.a
est une pile de cadeaux abordables,s
est la gamme de sortie des cadeaux vendus.gp
,bp
Etap
sont des pointeurs pourg
,b
eta
respectivement.bp
est également le pointeur des
.Algorithme:
g[gp]
a
et augmentezgp
a
danss[bp]
s'il existe, sinon mettez0
.la source
(g,b)->
à- direg->b->
?int
), j'avais besoin d'utiliser un tableau de types de référence. Mais je peux très bien utiliser un tableau d'int. Je mettrai à jour une fois que j'aurai une chance.Haskell, 87 * 0,6 = 52,2 octets
Complètement différent de mon autre réponse , car je vais pour le bonus.
La dernière ligne (->
g[]
) ne fait pas partie de la définition, mais appelle la surcharge. Exemple d'utilisation: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]
.Fonctionne essentiellement de la même manière que la réponse de @ CAD97 , c'est-à-dire utilise une pile d'assistance (initialement vide) pour garder une trace des articles achetables. En détail: vérifiez dans l'ordre:
Cela fonctionne dans le
m+n
temps, car a) les opérations sur la pile d'assistance utilisent un temps constant et b) dans chacun des appels récursifs, l'une des listes est raccourcie d'un élément.la source
Gelée , 15 octets
Essayez-le en ligne!
Comment ça fonctionne
la source
JavaScript, 85 * 0,6 = 51 octets
Un autre clone de la réponse de @ CAD97.
la source