Codeforces1303D. Fill The Bag

1e18对应2进制有58位,可以直接暴力模拟,因为读入的数都是2次幂,__builtin_ctz这个内置gcc函数可以算出二进制下末尾有几个0,读入时统计,然后从n的最低位开始判断,注意每次升位的时候如果有2个相同的就要向上一位进位,当拆掉比他大的数时,必定对比他大的位各个产生一个1,因为>>1

#include<bits/stdc++.h>
using namespace std;
#define lowbit(x) ((x)&(-x))
typedef long long LL;

int bit[65];
LL n;

int solve() {
    int ans = 0;
    for(int i = 0; i < 60; ++i) {
        if(n&(1LL<<i)) {
            for(int j = i; j <= 60; ++j) {
                if(j == 60) return -1;
                if(bit[j]) {
                    bit[j]--;
                    for(int k = i; k < j; ++k)
                        bit[k]++;
                    break;
                }
                ans++;
            }
        }
        bit[i+1] += bit[i] /2;
    }
    return ans;
}

void run_case() {
    int m, t;
    memset(bit, 0, sizeof(bit));
    cin >> n >> m;
    for(int i = 0; i < m; ++i) {
        cin >> t; bit[__builtin_ctz(t)]++;
    }
    cout << solve() << "\n";
}

int main() {
    ios::sync_with_stdio(false), cin.tie(0);
    //cout.setf(ios_base::showpoint);cout.precision(10);
    int t; cin >> t;
    while(t--)
    run_case();
    cout.flush();
    return 0;
}
View Code

 

posted @ 2020-02-13 15:42  GRedComeT  阅读(195)  评论(0编辑  收藏  举报