CodeforcesC. Powers Of Two

题意:找到k个数,并且都是2的多少次幂,这k个数相加等于n,不需要按顺序。

思路:看k>n,输出NO,如果k<n,先找出最少的情况所需要数的个数(就是这个数转化成二进制后1的个数),与k比较,大于k输出NO,小于k肯定是YES,然后每次找最大的那个数,除以2,得到两个数,把这两个数放到优先队列里面,知道size等于k,最后输出就可以了。

#include <bits/stdc++.h>
using namespace std;
int main()
{
    long long int n,k;
    int o=0;
    int a[50];
    scanf("%lld%lld",&n,&k);
    if(k>n)
    {
        printf("NO\n");
        return 0;
    }
    for(int i=0;i<32;i++)
    {
        if((1<<i)&n)
        {
            a[o++]=i;
        }
    }
    if(o>k)
        printf("NO\n");
    else
    {
        printf("YES\n");
        int ans[100010];
        priority_queue<int,vector<int>,less<int> >q;
        for(int i=0;i<o;i++)
        {
            long long int tt=(1<<a[i]);
            q.push(tt);
        }
        while(q.size()<k)
        {
            int temp=q.top();
            q.pop();
            q.push(temp/2);
            q.push(temp/2);
        }
        while(q.size()>1)
        {
            printf("%d ",q.top());
            q.pop();
        }
        printf("%d\n",q.top());
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/cpx17852033609/article/details/85331351