Codeforces Round #529 (Div. 3) C. Powers Of Two (二進位制)
阿新 • • 發佈:2020-08-22
-
題意:給你一個數\(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; }