A história
"2016? Tudo bem", resmungou Hilbert, vendedor de brinquedos. Ele abriu os olhos, limpou o molho de salada que escorria do ouvido e comeu um cremeschnitte de manhã. Férias exemplares. No entanto, ele precisa ir trabalhar agora e terminar a contabilidade do ano.
O Natal é um período muito produtivo do ano, especialmente para suas vendas. Hilbert sabe exatamente como funciona: uma pessoa entra em uma loja e compra o primeiro presente que lhe é oferecido. Eles pagam e correm para outra loja. Na prática, o que realmente é o presente realmente não faz diferença. O preço também é irrelevante, desde que não seja muito alto. Tudo depende do tempo restante até o Natal - quanto menor o tempo, maior o remorso dos clientes, maior o preço que eles estão dispostos a pagar.
Tudo o que é preciso para Hilbert é olhar para o relógio - e ele sabe imediatamente quanto seus clientes podem gastar. Ele pode facilmente tirar proveito desse fato: ele encontra o presente mais caro que pode vender para um determinado cliente e oferece a ele. Só agora ele percebeu que se esqueceu de empregar essa estratégia astuta no ano passado. Isso vai mudar!
No entanto, Hilbert gostaria de saber quanto seus negócios teriam florescido, se ele realmente tivesse usado seu grande esquema. Ele conseguiu reunir uma lista de pessoas que vieram à sua loja, mas não sabe ao certo quanto dinheiro poderia ter ganho com elas.
Sua tarefa (TL; DR)
A entrada consiste em uma lista crescente de preços de presentes disponíveis e uma lista dos orçamentos dos clientes. A lista de orçamentos está na mesma ordem em que os clientes chegaram à loja - com a condição de que todo cliente esteja disposto a pagar pelo menos o mesmo valor que o anterior, o que significa que também está em ascensão.
Para cada cliente, encontre o presente mais caro pelo qual está disposto a pagar e produza o preço. Se não houver presentes no orçamento disponíveis, produza a 0
.
Você recebe um -40%
bônus de caracteres, se a complexidade assintótica do seu algoritmo for O(n+m)
(em vez de trivial O(n*m)
) Onde n, m
estão os comprimentos das listas de entrada.
Isso é código-golfe , o menor número de bytes vence. As brechas padrão são proibidas.
Exemplo
Entrada:
1 2 2 2 5 7 10 20
1 1 2 3 6 6 15 21 21 22
Resultado:
1 0 2 2 5 2 10 20 7 0
Essa tarefa foi tirada de uma competição de programação local e traduzida para inglês por mim. Aqui está a tarefa original: https://www.ksp.sk/ulohy/zadania/1131/
Respostas:
Pitão,
1716 bytes1 byte graças a Pietu1998
Demonstração
Explicação:
fonte
VE=.-Q]
\ ne|fgNTQ0
. Basicamente a mesma coisa, mas com um loop.Haskell, 67 bytes
Exemplo de uso:
[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]
.Divida os preços em duas partes:
(h,t)
ondeh
estão todos os preços <= o orçamento do próximo cliente et
todos os outros. Pegue o último preço deh
e continue recursivamente com todos, exceto o último deh
maist
e os demais orçamentos.last(0:h)
avalia0
seh
está vazio. Similar:init (h++[0|h==[]]) ++ t
adiciona um elemento fictício0
ah
seh
estiver vazio, para queinit
haja algo a ser descartado (init
falha na lista vazia).fonte
Java, 154 * 0,6 = 92,4 bytes
-13 bytes porque o lambda pode realmente usar
int[]
, nãoInteger[]
(obrigado BunjiquoBianco )Isso deve levar tempo O (n + m) e espaço adicional O (n + m) (supondo que eu entenda grande notação O) .
Recuado: ( Experimente online! )
Eu mostro a expansão não lambda aqui porque a declaração de tipo é mais limpa e é exatamente a mesma lógica. O lambda está presente no link ideone.
Explicação:
Variáveis utilizadas:
g
é a lista de preços de presentes,b
é a lista de orçamentos.gl
é o comprimento deg
ebl
é o comprimento deb
.a
é uma pilha de presentes acessíveis,s
é a matriz de saída de presentes vendidos.gp
,bp
Eap
são ponteiros parag
,b
e,a
respectivamente.bp
também é o ponteiro paras
.Algoritmo:
g[gp]
a
e aumentegp
a
ems[bp]
se ele existir, ou então coloque0
.fonte
(g,b)->
parag->b->
?int
), eu precisava usar uma matriz de tipos de referência. Mas eu posso usar uma matriz de int muito bem. Vou atualizar assim que tiver uma chance.Haskell, 87 * 0,6 = 52,2 bytes
Completamente diferente da minha outra resposta , porque eu estou indo para o bônus.
A última linha (->
g[]
) não faz parte da definição, mas chama a sobrecarga. Exemplo de uso: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]
.Funciona basicamente da mesma maneira que a resposta do @ CAD97 , ou seja, usa uma pilha auxiliar (inicialmente vazia) para rastrear os itens compráveis. Em detalhes: verifique em ordem:
Isso funciona com o
m+n
tempo, porque a) as operações na pilha auxiliar usam tempo constante eb) em cada uma das chamadas recursivas, uma das listas é encurtada por um elemento.fonte
Gelatina , 15 bytes
Experimente online!
Como funciona
fonte
JavaScript, 85 * 0,6 = 51 bytes
Outro clone da resposta do @ CAD97.
fonte