- Powers Of Two
- 题意 : 问能否把 n分解成 k个 2 的次幂 的和
- 思路:优先队列维护 分成的 数,如果数目<k 取出最大的继续分解。控制好终止条件即可。
- 当 个数>k ,或者 小于 k 并且全为1了不能再分解了 停止输出NO,恰好为 K 停止输出即可 。
-
#include<bits/stdc++.h> using namespace std; #define ll long long #define maxn 123 int n,k,ans,d; priority_queue<int>p; ll a[maxn]; map<ll,int>ad; int main() { bool flag=0; scanf("%d%d",&n,&k); for(long long i=0; i<=32; i++) { a[i]=((long long )1<<i); ad[((long long )1<<i)]=i; } d=32; while(ans<k) { while(n) { while(n>=a[d]) { ans++; p.push(a[d]); n-=a[d]; } d--; if(d<0)break; } if(ans==k)break; if(ans>k) { flag=1; break; } if(ans<k&&p.top()==1) { flag=1; break; } ans--; n=p.top(); p.pop(); d=ad[n]-1; } if(flag==0) { printf("YES\n"); for(int i=0; i<ans; i++) { printf("%d",p.top()); if(i<ans-1)printf(" "); else printf("\n"); p.pop(); } } else printf("NO\n"); return 0; }
Powers Of Two-思维
最新推荐文章于 2020-05-06 15:04:18 发布