2022-12-28 Daily Challenge
Today I have done leetcode's December LeetCoding Challenge with cpp
.
December LeetCoding Challenge 28
Description
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 removefloor(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 2. The resulting piles are [4,3,3,7]. - Apply the operation on pile 3. 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.
Constraints:
1 <= piles.length <= 105
1 <= piles[i] <= 104
1 <= k <= 105
Solution
class Solution {
public:
int minStoneSum(vector<int>& piles, int k) {
map<int, int, greater<int>> count;
int answer = 0;
for(auto pile : piles) {
count[pile] += 1;
answer += pile;
}
while(k) {
auto it = count.begin();
if(it->first < 2) break;
if(k > it->second) {
answer -= (it->first / 2) * it->second;
count[it->first - it->first / 2] += it->second;
k -= it->second;
count.erase(it);
} else {
answer -= (it->first / 2) * k;
k = 0;
}
}
return answer;
}
};
// Accepted
// 59/59 cases passed (352 ms)
// Your runtime beats 99.48 % of cpp submissions
// Your memory usage beats 5 % of cpp submissions (107.8 MB)