2558. Prenez des cadeaux de la pile la plus riche
Difficulté :Facile
Sujets : Tableau, tas (file d'attente prioritaire), simulation
Vous recevez un tableau de cadeaux entiers indiquant le nombre de cadeaux répartis dans différentes piles. Chaque seconde, vous effectuez les opérations suivantes :
Renvoyer le nombre de cadeaux restants après k secondes.
Exemple 1 :
Exemple 2 :
Contraintes :
Indice :
Solution :
Nous pouvons utiliser un tas maximum (file d'attente prioritaire) car nous devons sélectionner à plusieurs reprises la pile avec le nombre maximum de cadeaux. Un tas maximum nous permettra d'accéder efficacement à la plus grande pile en temps constant et de mettre à jour le tas après avoir retiré les cadeaux de la pile.
Utilisez un tas maximum :
Traitement chaque seconde :
Résiliation :
Implémentons cette solution en PHP : 2558. Prenez des cadeaux de la pile la plus riche
<?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> Explication: </h3> <ol> <li> <p><strong>Initialisation du tas</strong> :</p> <ul> <li> SplPriorityQueue est utilisé pour simuler un tas maximum. La méthode insert nous permet de pousser des éléments dans le tas avec une priorité.</li> </ul> </li> <li> <p><strong>Traitement du plus gros tas</strong> :</p> <ul> <li>Pour k itérations, le plus gros tas est extrait à l'aide de l'extrait.</li> <li>Le nombre de cadeaux laissés derrière est calculé comme le plancher de la racine carrée de la plus grande pile actuelle en utilisant floor(sqrt(...)).</li> <li>Le tas réduit est réinséré dans le tas.</li> </ul> </li> <li> <p><strong>Résumation des cadeaux restants</strong> :</p> <ul> <li>Après les k opérations, tous les éléments du tas sont extraits et additionnés pour obtenir le nombre total de cadeaux restants.</li> </ul> </li> <li> <p><strong>Cas Edge</strong> :</p> <ul> <li>Si les cadeaux sont vides, le résultat est 0.</li> <li>Si k est supérieur au nombre d'opérations possibles, l'algorithme le gère gracieusement.</li> </ul> </li> </ol> <h3> Complexité temporelle : </h3> <ul> <li> <strong>Opérations sur le tas (insertion et extraction)</strong> : Chaque opération sur le tas (insertion et extraction) prend <em><strong>O(log n)</strong></em>, où <em><strong>n</strong></em> est le nombre de pieux.</li> <li> <strong>Bouclage à travers k opérations</strong> : Nous effectuons <em><strong>k</strong></em> opérations, chacune impliquant une extraction et une insertion de tas, toutes deux prenant <em><strong>O(log n)</strong></em>.</li> </ul> <p>Ainsi, la complexité temporelle totale est <em><strong>O(k log n)</strong></em>, où <em><strong>n</strong></em> est le nombre de piles et <em><strong>k</strong></em> est le nombre de secondes.</p> <h3> Exemple de procédure pas à pas : </h3> <p>Pour la saisie :<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 ?>
La somme des cadeaux restants est 5 8 9 4 3 = 29.
Cette approche résout efficacement le problème en utilisant un tas maximum et fonctionne bien dans les limites des contraintes données.
Liens de contact
Si vous avez trouvé cette série utile, pensez à donner une étoile au référentiel sur GitHub ou à partager la publication sur vos réseaux sociaux préférés ?. Votre soutien signifierait beaucoup pour moi !
Si vous souhaitez du contenu plus utile comme celui-ci, n'hésitez pas à me suivre :
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!