CodeForces - 1095C Powers Of Two(思维)
生活随笔
收集整理的這篇文章主要介紹了
CodeForces - 1095C Powers Of Two(思维)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
題目鏈接:點擊查看
題目大意:給出n和k,問能否將n分解成k個二的冪次之和,可以重復(fù)
題目分析:首先我們需要知道二的冪次是1,2,4,8等等之類二的n次方這樣的類型,我們很容易知道不能分解的情況,一種情況是n轉(zhuǎn)換成二進制之后,出現(xiàn)的1的個數(shù)比k多,那么肯定是沒法用k個數(shù)分解的,還有一種情況就是k大于n,因為最壞情況也是n分解為n個1,再然后就沒辦法分解了,所以當k大于n的時候也可以直接判斷了
剩下的就是如何分解,一開始我是不太會操作的,總感覺自己實現(xiàn)會超級麻煩,于是上網(wǎng)搜了一下,發(fā)現(xiàn)有個大佬用的mutilset,也就是用了他內(nèi)部自動排序的功能,等等。。內(nèi)部自動排序?這給我提供了思路,于是我就用優(yōu)先隊列簡簡單單的實現(xiàn)了。。因為太菜了不會用mutilset
具體是怎么實現(xiàn)的呢?我們讓優(yōu)先隊列默認給int排序,就是從大到小排的,如果當前的二的冪次個數(shù)不足k個,我們就取出最大的那個數(shù),將其先出隊,除以二后加入兩遍隊列即可
很簡單的實現(xiàn),不多解釋了,上代碼:
#include<iostream> #include<cstdio> #include<string> #include<ctime> #include<cstring> #include<algorithm> #include<stack> #include<queue> #include<map> #include<sstream> using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=110;int decode(int n) {int cnt=0;while(n){if(n&1)cnt++;n>>=1;}return cnt; }int main() { // freopen("input.txt","r",stdin);int n,k;while(scanf("%d%d",&n,&k)!=EOF){int num=decode(n);if(k<num||k>n){printf("NO\n");continue;}else{printf("YES\n");}priority_queue<int>q;int cnt=0;while(n){if(n&1)q.push((1<<cnt));n>>=1;cnt++;}while(q.size()<k){if(q.top()==1)break;int temp=q.top();q.pop();q.push(temp/2);q.push(temp/2);}while(!q.empty()){printf("%d ",q.top());q.pop();}printf("\n");}return 0; }?
總結(jié)
以上是生活随笔為你收集整理的CodeForces - 1095C Powers Of Two(思维)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: POJ - 1922 Ride to S
- 下一篇: FZU - 2202 犯罪嫌疑人(逻辑思