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; }
𝓐𝓬𝓱𝓲𝓮𝓿𝓮𝓶𝓮𝓷𝓽 𝓹𝓻𝓸𝓿𝓲𝓭𝓮𝓼 𝓽𝓱𝓮 𝓸𝓷𝓵𝔂 𝓻𝓮𝓪𝓵
𝓹𝓵𝓮𝓪𝓼𝓾𝓻𝓮 𝓲𝓷 𝓵𝓲𝓯𝓮

浙公网安备 33010602011771号