Cerita
"2016? Al..baik," gerutu penjual mainan Hilbert. Dia membuka matanya, mengusap saus salad yang menetes dari telinganya dan makan cremeschnitte pagi yang baru dimulai. Teladan liburan. Dia perlu pergi bekerja sekarang, dan menyelesaikan akuntansi tahun ini.
Natal adalah periode yang sangat menguntungkan tahun ini, terutama untuk penjualannya. Hilbert tahu persis cara kerjanya: Seseorang datang ke toko dan membeli hadiah pertama yang mereka tawarkan. Mereka membayarnya dan lari ke toko lain. Dalam praktiknya, apa sebenarnya hadiah itu sebenarnya tidak membuat perbedaan. Harganya juga tidak relevan, asalkan tidak terlalu tinggi. Itu semua tergantung pada waktu yang tersisa sampai Natal - semakin pendek waktunya, semakin besar penyesalan pelanggan, semakin besar harga yang mereka bayarkan.
Yang diperlukan untuk Hilbert adalah melihat arlojinya - dan dia langsung tahu berapa banyak yang bisa dihabiskan pelanggannya. Dia dapat dengan mudah mengambil keuntungan dari fakta ini: Dia hanya menemukan hadiah paling mahal yang bisa dia jual kepada pelanggan tertentu, dan menawarkannya kepada mereka. Baru sekarang dia menyadari bahwa dia lupa menggunakan strategi licik ini tahun lalu. Itu akan berubah!
Namun demikian, Hilbert ingin tahu berapa banyak bisnisnya akan berkembang, jika dia benar-benar menggunakan skema besarnya. Dia berhasil mengumpulkan daftar orang-orang yang datang ke tokonya, tetapi dia tidak yakin berapa banyak uang yang dapat dia hasilkan dari mereka.
Tugas Anda (TL; DR)
Input terdiri dari ascending daftar harga hadiah yang tersedia, dan daftar anggaran pelanggan. Daftar anggaran berada dalam urutan yang sama seperti pelanggan datang ke toko - dengan syarat bahwa setiap pelanggan bersedia membayar setidaknya sebanyak yang sebelumnya, yang berarti juga naik.
Untuk setiap pelanggan, temukan hadiah termahal yang bersedia mereka bayar, dan berikan harga. Jika tidak ada hadiah dalam anggaran, output a 0
.
Anda mendapatkan -40%
bonus karakter, jika kompleksitas waktu asimptotik dari algoritma Anda O(n+m)
(bukan sepele O(n*m)
) Di mana n, m
panjang daftar input.
Ini adalah kode-golf , byte terpendek menang. Celah standar dilarang.
Contoh
Memasukkan:
1 2 2 2 5 7 10 20
1 1 2 3 6 6 15 21 21 22
Keluaran:
1 0 2 2 5 2 10 20 7 0
Tugas ini diambil dari kompetisi pemrograman lokal, dan diterjemahkan ke dalam bahasa Inggris oleh saya. Inilah tugas aslinya: https://www.ksp.sk/ulohy/zadania/1131/
Jawaban:
Pyth,
1716 byte1 byte terima kasih kepada Pietu1998
Demonstrasi
Penjelasan:
sumber
VE=.-Q]
\ ne|fgNTQ0
. Pada dasarnya hal yang sama tetapi dengan satu lingkaran.Haskell, 67 byte
Contoh penggunaan:
[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]
.Membagi harga menjadi dua bagian: di
(h,t)
manah
semua harga <= anggaran pelanggan berikutnya dant
yang lainnya. Ambil harga terakhirh
dan lanjutkan secara rekursif dengan semua kecuali nilaih
tambah terakhirt
dan sisa anggaran.last(0:h)
mengevaluasi0
apakahh
kosong. Mirip:init (h++[0|h==[]]) ++ t
menambahkan elemen dummy0
keh
jikah
kosong, sehinggainit
memiliki sesuatu untuk dijatuhkan (init
gagal pada daftar kosong).sumber
Java, 154 * 0,6 = 92,4 byte
-13 byte karena lambda benar-benar dapat digunakan
int[]
, bukanInteger[]
(terima kasih BunjiquoBianco )Ini harus mengambil O (n + m) waktu dan O (n + m) ruang tambahan (dengan asumsi saya mengerti notasi O besar) .
Diindentasi: ( Coba online! )
Saya menunjukkan ekspansi non-lambda di sini karena deklarasi tipe lebih bersih dan logika yang persis sama. Lambda hadir di tautan ideone.
Penjelasan:
Variabel yang digunakan:
g
adalah daftar harga hadiah,b
adalah daftar anggaran.gl
adalah panjangg
danbl
adalah panjangnyab
.a
adalah tumpukan untuk hadiah yang terjangkau,s
adalah rangkaian output dari hadiah yang dijual.gp
,bp
, Danap
adalah pointer untukg
,b
dana
masing-masing.bp
juga merupakan penunjuk untuks
.Algoritma:
g[gp]
a
dan incrementgp
a
ke dalams[bp]
jika ada, taruh lagi0
.sumber
(g,b)->
keg->b->
?int
) bahwa saya perlu menggunakan array tipe referensi. Tapi saya bisa menggunakan array int dengan baik. Saya akan memperbarui setelah saya mendapat kesempatan.Haskell, 87 * 0,6 = 52,2 byte
Sangat berbeda dari jawaban saya yang lain , karena saya akan mendapat bonus.
Baris terakhir (->
g[]
) bukan bagian dari definisi, tetapi memanggil overhead. Contoh penggunaan: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]
.Bekerja pada dasarnya dengan cara yang sama dengan jawaban @ CAD97 , yaitu menggunakan tumpukan pembantu (awalnya kosong) untuk melacak barang-barang yang dapat dibeli. Secara detail: check in order:
Ini bekerja
m+n
tepat waktu, karena a) operasi pada tumpukan pembantu menggunakan waktu konstan dan b) dalam setiap panggilan rekursif, salah satu daftar disingkat oleh satu elemen.sumber
Jelly , 15 byte
Cobalah online!
Bagaimana itu bekerja
sumber
JavaScript, 85 * 0,6 = 51 byte
Klon lain dari jawaban @ CAD97.
sumber