C - Division

把每个数先压到优先队列中,每次操作取队顶元素除2再压进去,同时判断下队顶是否为0,如果为0就没必要继续操作了。因为数大小1e9所以每个数最多就操作30次。

#include<stdio.h>
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+7;
priority_queue<int>a;
int main(){
    int n,k,aa;
    scanf("%d%d",&n,&k);
    for(int i=0;i<n;i++){
        scanf("%d",&aa);
        a.push(aa);
    }
    ll ans=0;
    for(int i=0;i<k;i++){
        aa=a.top();
        a.pop();
        if(aa==0){
            break;
        }
        a.push(aa/2);
    }
    while(!a.empty()){
        if(a.top()==0)break;
        ans+=a.top();
        a.pop();
    }
    printf("%lld\n",ans);
    return 0;
}