2558. Ambil Hadiah Daripada Longgokan Terkaya
Kesukaran: Mudah
Topik: Tatasusunan, Timbunan (Baris Gilir Keutamaan), Simulasi
Anda diberi hadiah tatasusunan integer yang menandakan bilangan hadiah dalam pelbagai longgokan. Setiap saat, anda melakukan perkara berikut:
Kembalikan bilangan hadiah yang tinggal selepas k saat.
Contoh 1:
Contoh 2:
Kekangan:
Petunjuk:
Penyelesaian:
Kami boleh menggunakan timbunan maksimum (baris gilir keutamaan) kerana kami perlu berulang kali memilih longgokan dengan bilangan maksimum hadiah. Timbunan maksimum akan membolehkan kami mengakses longgokan terbesar dengan cekap dalam masa yang tetap dan mengemas kini longgokan selepas mengambil hadiah daripada longgokan.
Gunakan Max-Heap:
Proses Setiap Detik:
Penamatan:
Mari laksanakan penyelesaian ini dalam PHP: 2558. Ambil Hadiah Daripada Longgokan Terkaya
<?php /** * @param Integer[] $gifts * @param Integer $k * @return Integer */ function pickGifts($gifts, $k) { ... ... ... /** * go to ./solution.php */ } // Example usage: $gifts1 = [25, 64, 9, 4, 100]; $k1 = 4; echo pickGifts($gifts1, $k1) . "\n"; // Output: 29 $gifts2 = [1, 1, 1, 1]; $k2 = 4; echo pickGifts($gifts2, $k2) . "\n"; // Output: 4 ?> <h3> Penjelasan: </h3> <ol> <li> <p><strong>Permulaan Timbunan</strong>:</p> <ul> <li> SplPriorityQueue digunakan untuk mensimulasikan timbunan maks. Kaedah sisipan membolehkan kami menolak elemen ke dalam timbunan dengan keutamaan.</li> </ul> </li> <li> <p><strong>Memproses Longgokan Terbesar</strong>:</p> <ul> <li>Untuk lelaran k, longgokan terbesar diekstrak menggunakan ekstrak.</li> <li>Bilangan hadiah yang ditinggalkan dikira sebagai lantai punca kuasa dua cerucuk terbesar semasa menggunakan lantai(sqrt(...)).</li> <li>Cucuk yang dikurangkan dimasukkan semula ke dalam timbunan.</li> </ul> </li> <li> <p><strong>Menjumlahkan Baki Hadiah</strong>:</p> <ul> <li>Selepas operasi k, semua elemen dalam timbunan diekstrak dan disimpulkan untuk mendapatkan jumlah bilangan hadiah yang tinggal.</li> </ul> </li> <li> <p><strong>Kes Tepi</strong>:</p> <ul> <li>Jika hadiah kosong, hasilnya ialah 0.</li> <li>Jika k lebih besar daripada bilangan operasi yang mungkin, algoritma mengendalikannya dengan anggun.</li> </ul> </li> </ol> <h3> Kerumitan Masa: </h3> <ul> <li> <strong>Operasi timbunan (masukkan dan ekstrak)</strong>: Setiap operasi timbunan (sisipan dan pengekstrakan) mengambil masa <em><strong>O(log n)</strong></em>, di mana <em><strong>n</strong></em> ialah bilangan cerucuk.</li> <li> <strong>Loosing melalui k operasi</strong>: Kami melaksanakan <em><strong>k</strong></em> operasi, setiap satunya melibatkan pengekstrakan timbunan dan sisipan, kedua-duanya mengambil <em><strong>O(log n)</strong></em>.</li> </ul> <p>Oleh itu, jumlah kerumitan masa ialah <em><strong>O(k log n)</strong></em>, dengan <em><strong>n</strong></em> ialah bilangan cerucuk dan <em><strong>k</strong></em> ialah bilangan saat.</p> <h3> Contoh Panduan: </h3> <p>Untuk input:<br> </p> <pre class="brush:php;toolbar:false"><?php /** * @param Integer[] $gifts * @param Integer $k * @return Integer */ function pickGifts($gifts, $k) { ... ... ... /** * go to ./solution.php */ } // Example usage: $gifts1 = [25, 64, 9, 4, 100]; $k1 = 4; echo pickGifts($gifts1, $k1) . "\n"; // Output: 29 $gifts2 = [1, 1, 1, 1]; $k2 = 4; echo pickGifts($gifts2, $k2) . "\n"; // Output: 4 ?>
Jumlah hadiah yang tinggal ialah 5 8 9 4 3 = 29.
Pendekatan ini menyelesaikan masalah dengan cekap menggunakan timbunan maksimum dan berfungsi dengan baik dalam kekangan yang diberikan.
Pautan Kenalan
Jika anda mendapati siri ini membantu, sila pertimbangkan untuk memberi repositori bintang di GitHub atau berkongsi siaran pada rangkaian sosial kegemaran anda ?. Sokongan anda amat bermakna bagi saya!
Jika anda mahukan kandungan yang lebih berguna seperti ini, sila ikuti saya:
Atas ialah kandungan terperinci Ambil Hadiah Daripada Longgokan Terkaya. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!