Codeforces 1003D Coins and Queries 【性質】

知道作這道題須要性質,怎麼入手?ios

我想的是輸入保證了a[i]都是power of two,而不是任意的數,那麼必定得從二的整次數冪入手解決問題。spa

想到若是一個b能夠被拼出來,那麼他就能被寫成多個power of 2相加的形式;那麼咱們每次用最大的power of 2去拼這個b,而後power of 2再逐漸減少,若是能拼的出來的話那他必定是答案;那會不會出現本來拼的出來,但在這種策略下拼不出來的狀況呢?(及不該該每次用最大的去拼b)不會,由於若是你能用其餘的方式拼出b(並且有更大的power of 2可取但沒取),那你必定能夠用那些小點的power of 2拼出來這個大的power of 2code

 

考場的時候我忽略了2^0=1,以爲若是b是基數那確定拼不出來.....5555555555555blog

 

 1 #include<iostream>
 2 #include<map>
 3 using namespace std;  4 
 5 int a[200005];  6 map<int,int> m;  7 
 8 int main(){  9     int n,q; cin>>n>>q; 10     for(int i=1;i<=n;i++){ 11         cin>>a[i]; 12         m[ a[i] ]++; 13  } 14     
15     for(int i=1;i<=q;i++){ 16         int b; cin>>b; 17         int count=0; 18         for(int j=29;j>=0;j--){//先用大的拼
19             if( b==0 ) break; 20             int num = (1<<j); 21             if( num>b || m[num]==0 ) continue; 22             int take =  min( m[num],b/num ); 23             count+=take; b-=take*num; 24  } 25 
26         if(b>0) cout<<-1<<endl; 27         else cout<<count<<endl; 28  } 29     
30     return 0; 31 }
相關文章
相關標籤/搜索