知道作这道题须要性质,怎么入手?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 }