1. 程式人生 > >CodeforcesC. Powers Of Two

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;
}