2558. Take Gifts From the Richest Pile


  • You are given an integer array gifts denoting the number of gifts in various piles. Every second, you do the following:
    • Choose the pile with the maximum number of gifts.
    • If there is more than one pile with the maximum number of gifts, choose any.
    • Leave behind the floor of the square root of the number of gifts in the pile. Take the rest of the gifts.
  • Return the number of gifts remaining after k seconds.

Example 1

Input: gifts = [25,64,9,4,100], k = 4
Output: 29
Explanation: 
The gifts are taken in the following way:
- In the first second, the last pile is chosen and 10 gifts are left behind.
- Then the second pile is chosen and 8 gifts are left behind.
- After that the first pile is chosen and 5 gifts are left behind.
- Finally, the last pile is chosen again and 3 gifts are left behind.
The final remaining gifts are [5,8,9,4,3], so the total number of gifts remaining is 29.

Example 2

Input: gifts = [1,1,1,1], k = 4
Output: 4
Explanation: 
In this case, regardless which pile you choose, you have to leave behind 1 gift in each pile. 
That is, you can't take any pile with you. 
So, the total gifts remaining are 4.

Method 1

【O(k * log(n)) time | O(n) space】
package Leetcode.Greedy;

import java.util.PriorityQueue;

/**
 * @author zhengxingxing
 * @date 2024/12/12
 */
public class TakeGiftsFromTheRichestPile {
    public static long pickGifts(int[] gifts, int k) {
        // Create a max heap (priority queue with descending order)
        PriorityQueue<Integer> maxHeap = new PriorityQueue<>((a,b) -> b - a);

        // Add all gift quantities to the max heap
        for (int gift: gifts) {
            maxHeap.add(gift);
        }

        // Perform k operations
        while (k-- > 0){
            // Take the largest gift pile
            int gift = maxHeap.poll();

            // Calculate square root and round down
            gift = (int)Math.sqrt(gift);

            // Add modified gift pile back to the heap
            maxHeap.add(gift);
        }

        // Calculate total remaining gifts
        long ans = 0;
        while (!maxHeap.isEmpty()){
            ans += maxHeap.poll();
        }

        return ans;
    }

    public static void main(String[] args) {
        // Test case 1
        int[] gifts1 = {25, 64, 9, 4, 100};
        int k1 = 4;
        System.out.println("Test case 1 result: " + pickGifts(gifts1, k1)); // Expected output: 29

        // Test case 2
        int[] gifts2 = {1, 1, 1, 1};
        int k2 = 4;
        System.out.println("Test case 2 result: " + pickGifts(gifts2, k2)); // Expected output: 4
    }
}




Enjoy Reading This Article?

Here are some more articles you might like to read next:

  • 2379. Minimum Recolors to Get K Consecutive Black Blocks
  • 2471. Minimum Number of Operations to Sort a Binary Tree by Level
  • 1387. Sort Integers by The Power Value
  • 2090. K Radius Subarray Averages
  • 2545. Sort the Students by Their Kth Score