链接:
题意:
给定一个正数数组,每次可以让一个数字减半,求将数组减少一半及以上 的最小次数
解:
每次找数组中存在的最大数减半,贪心,数组比较长,配合优先队列、单调栈
实际代码:
c++
#include<bits/stdc++.h>
using namespace std;
int halveArray(vector<int>& nums)
{
double sum=0;int ans=0;
priority_queue<double,vector<double>,less<double>>p_q;
for(auto &num:nums)
{
sum+=num;
p_q.push(num);
}
sum/=2;
while(sum>0)
{
double temp=p_q.top();p_q.pop();
if(temp>0)
{
temp/=2;
sum-=temp;
p_q.push(temp);
ans++;
}
}
return ans;
}
int main()
{
vector<int>nums;int temp;
while(cin>>temp)
{
nums.push_back(temp);
}
int ans=halveArray(nums);
cout<<ans<<endl;
return 0;
}
限制:
1 <= nums.length <= 105
1 <= nums[i] <= 107