1. 程式人生 > 實用技巧 >Codeforces Round #529 (Div. 3) C. Powers Of Two (二進位制)

Codeforces Round #529 (Div. 3) C. Powers Of Two (二進位制)

  • 題意:給你一個數\(n\),問是否能有\(k\)\(2\)次方的數構成,若滿足,輸出一種合法的情況.

  • 題解:從高到低列舉二進位制的每一位,求出\(n\)的二進位制的\(1\)的位置放進優先佇列中,因為\(2\)次方最小的值是\(1\),並且只能拆分不能合併,所以判斷一下是否滿足,然後對於\(2^i\),我們可以拆分成\(2^{i-1}\)\(2^{i-1}\),這樣總數就會\(+1\),用優先佇列來模擬這個過程,當總個數等於\(k\)時就滿足條件了.

  • 程式碼:

    int n,k;
    priority_queue<int,vector<int>> q;
     
    int main() {
        //ios::sync_with_stdio(false);cin.tie(0);
        scanf("%d %d",&n,&k);
     
        for(int i=30;i>=0;--i){
            if(n&(1<<i)){
                q.push(i);
            }
        }
     
        if(n<k || q.size()>k) puts("NO");
        else{
            puts("YES");
            while(q.size()<k){
                int tmp=q.top();
                q.pop();
                q.push(tmp-1);
                q.push(tmp-1);
            }
            while(!q.empty()){
                int tmp=q.top();
                q.pop();
                printf("%d ",(1<<tmp));
            }
        }
     
     
        return 0;
    }