1. 程式人生 > 其它 >CF1303D Fill The Bag

CF1303D Fill The Bag

思路:

貪心。

實現:

 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 }