思路:
贪心。
实现:
1 #include<bits/stdc++.h> 2 using namespace std; 3 int main(){ 4 int t;cin>>t; 5 while(t--){ 6 long long n;int m;cin>>n>>m; 7 vector<int>v(64,0); 8 long long sum=0; 9 for(int i=0;i<m;i++){ 10 int x;cin>>x; 11 sum+=x; 12 int cnt=0; 13 while(x){ 14 x>>=1; 15 cnt++; 16 } 17 v[cnt]++; 18 } 19 if(sum<n){ 20 cout<<-1<<endl;continue; 21 } 22 int cnt=1; 23 int res=0; 24 while(n){ 25 if(n&1){ 26 if(v[cnt]==0){ 27 int tmp=cnt; 28 while(tmp<64 and v[tmp]==0){ 29 tmp++; 30 } 31 for(int j=tmp;j>cnt;j--){ 32 res++; 33 v[j]--; 34 v[j-1]+=2; 35 } 36 } 37 v[cnt]--; 38 } 39 if(v[cnt]>=2){ 40 v[cnt+1]+=v[cnt]/2; 41 } 42 cnt++; 43 n>>=1; 44 } 45 cout<<res<<endl; 46 } 47 return 0; 48 }