题意:找到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;
}