题目大意
给正整数数组,每次操作:挑一个数字,把它变成原来的一半 (可以浮点数)。 求:让数组总和至少减少一半,最少需要多少次操作。
解法
贪心思路:每一次,永远选当前最大的数字减半 。 把最大的数减半,单次带来的总和下降量最大,总操作次数最少。 数据结构:大根堆(优先队列
priority_queue),每次取出最大值。
cpp
class Solution {
public:
int halveArray(vector<int>& nums) {
priority_queue<double >heap;
double sum=0;
for(auto e:nums)
{
heap.push(e);
sum+=e;
}
double target=sum/2.0;
int i=0;
while(sum>target)
{
double high=heap.top()/2;heap.pop();
heap.push(high);
sum-=high;
i++;
}
return i;
}
};