codeforces 1095C Powers Of Two
阿新 • • 發佈:2018-12-31
題目:
題意:
給出一個n和一個k,能否用k個2的x方的數的和等於n。
思路:
將2的前29次方求出,然後從大往小遍歷,儘可能的選大的數放入一個map中,記下放入數的次數Size。
如果Size<n||k>n則輸出NO。
否則,就將大於1的數進行分解,知道大於等於n為止。
程式碼如下:
#include <bits/stdc++.h> using namespace std; const int maxn=2*1e5+5; int n,k; int a[35]; vector<int>v; map<int,int>ma; int main() { a[0]=1; for (int i=1;i<31;i++) a[i]=a[i-1]*2; scanf("%d%d",&n,&k); int temp=n,Size=0; for (int i=30;i>=0&&temp;i--) { if (a[i]<=temp) { ma[a[i]]=temp/a[i]; Size+=temp/a[i]; temp-=a[i]*(temp/a[i]); } } if(Size>k||n<k) { printf("NO\n"); } else { while (Size<k) { for (map<int,int>::iterator it=ma.begin();it!=ma.end();it++) { if(Size>=k) break; //printf("%d %d\n",it->first,it->second); if(it->first!=1&&it->second) { ma[it->first/2]+=2; Size++; it->second--; } } } if(Size>k) { printf("NO\n"); } else { printf("YES\n"); for (map<int,int>::iterator it=ma.begin();it!=ma.end();it++) for (int i=0;i<it->second;i++) printf("%d ",it->first); printf("\n"); } } return 0; }