题目:CF1095C Powers Of Two
思路:
如果不考虑输出结果,可以考虑把n分成尽量大的数。
如果考虑输出结果,且分得得数数量不够,就把一些大于1的数分成两个就好了。
代码:
#include<bits/stdc++.h>
using namespace std;#define read(x) scanf("%d",&x)int n,k;
vector<int> ans;int main() {
read(n),read(k);if(k>n) {
printf("NO");return 0;}for(int i=30;i>=0;i--) {
while(n>=(1<<i)) n-=(1<<i),ans.push_back(1<<i);}if((int)ans.size()>k) printf("NO");else {
int t=0;while(k>ans.size()) {
while(ans[t]<=1) t++;ans[t]/=2;ans.push_back(ans[t]);}printf("YES\n");for(int i=0;i<ans.size();i++) printf("%d ",ans[i]);}return 0;
}