登录—专业IT笔试面试备考平台_牛客网牛客网是互联网求职神器,C++、Java、前端、产品、运营技能学习/备考/求职题库,在线进行百度阿里腾讯网易等互联网名企笔试面试模拟考试练习,和牛人一起讨论经典试题,全面提升你的技术能力https://ac.nowcoder.com/acm/contest/8563/A
给一个数组,一共有 n 个数。
你能进行最多 k 次操作。每次操作可以进行以下步骤:
- 选择数组中的一个偶数 a,将其变成 a/2。
现在你进行不超过 k 次操作后,让数组中所有数之和尽可能小。请输出这个最小的和。
第一行输入两个正整数 n 和 k ,用空格隔开
第二行输入n 个正整数 ai
数据范围:
1≤n≤100000,1≤k≤1091 ≤ n≤100000,1≤k≤10^91≤n≤100000,1≤k≤109
1≤ai≤1091≤a_i≤10^91≤ai≤109
输出描述:
一个正整数,代表和的最小值。
示例1
输入
5 3 2 4 8 10 11
5 3
2 4 8 10 11
输出
24
说明
对8操作2次,对10操作1次,最后的数组是2 4 2 5 11。可以证明这样的操作是最优的。
题目分析:
算法原理:
解法:模拟、贪心、堆
#include<iostream>
#include<queue>
using namespace std;
typedef long long ll;
ll n,k;
priority_queue<ll> heap;
int main()
{
cin >> n >> k;
ll sum=0,x;
while(n--)
{
cin >> x;
sum+=x;
if(x%2==0)
{
heap.push(x);
}
}
while(heap.size() && k--)
{
ll t = heap.top()/2;
heap.pop();
sum-=t;
if(t%2==0)
heap.push(t);
}
cout << sum <<endl;
return 0;
}