首页 > 其他 > 详细

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

时间:2020-08-21 23:05:58      阅读:100      评论:0      收藏:0      [点我收藏+]

技术分享图片

  • 题意:给你一个数\(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;
    }
    

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

原文:https://www.cnblogs.com/lr599909928/p/13543672.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!