Remove Stones to Minimize the Total

You are given a 0-indexed integer array piles, where piles[i] represents the number of stones in the ith pile, and an integer k. You should apply the following operation exactly k times:

  • Choose any piles[i] and remove floor(piles[i] / 2) stones from it.

Notice that you can apply the operation on the same pile more than once.

Return the minimum possible total number of stones remaining after applying the k operations.

floor(x) is the greatest integer that is smaller than or equal to x (i.e., rounds x down).

Example 1:

Input: piles = [5,4,9], k = 2
Output: 12
Explanation: Steps of a possible scenario are:
- Apply the operation on pile 2. The resulting piles are [5,4,5].
- Apply the operation on pile 0. The resulting piles are [3,4,5].
The total number of stones in [3,4,5] is 12.

Example 2:

Input: piles = [4,3,6,7], k = 3
Output: 12
Explanation: Steps of a possible scenario are:
- Apply the operation on pile 3. The resulting piles are [4,3,3,7].
- Apply the operation on pile 4. The resulting piles are [4,3,3,4].
- Apply the operation on pile 0. The resulting piles are [2,3,3,4].
The total number of stones in [2,3,3,4] is 12.

Approach

Java

import java.util.Collections;
import java.util.PriorityQueue;

public class MinimumStoneSum {
    public static void main(String[] args) {

        int[] piles = { 549 };
        int k = 2;

        System.out.println(minStoneSum(piles, k));

    }

    static int minStoneSum(int[] pilesint k) {
        PriorityQueue<Integerq = new 
PriorityQueue<Integer>( Collections.reverseOrder());

        for (int i = 0; i < piles.length; i++)
            q.add(piles[i]);

        while (k > 0 && q.size() > 0) {
            int x = q.peek();
            if (x > 1) {
                
                   q.poll;
                q.add((x + 1) / 2);
            }
            k--;
        }
        int sum = 0;
        while (!q.isEmpty()) {
            sum += q.poll();

        }
        return sum;
    }

}

C++

#include <bits/stdc++.h>
using namespace std;

int minStoneSum(vector<int&pilesint k)
{

    priority_queue<intq;

    for (int i = 0i < piles.size(); i++)
        q.push(piles[i]);

    while (k > 0 && q.size() > 0)
    {
        int x = q.top();
        if (x > 1)
        {
            q.pop();

            q.push((x + 1) / 2);
        }
        k--;
    }
    int sum = 0;
    while (!q.empty())
    {
        sum += q.top();
        q.pop();
    }
    return sum;
}
int main()
{
    vector<intpiles = {549};
    int k = 2;

    cout << minStoneSum(pilesk<< "\n";

    return 0;
}


No comments:

Post a Comment