CodeforcesC. Powers Of Two
阿新 • • 發佈:2019-01-02
題意:找到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; }