总结
贪心的思路是对,但是有几个点处理导致一直WA
问题
1:二进位低位可以往高位升级
例如 1 1 1 1进化2 2进化4
2:pos位存在,可以把n的pos位以前的所有位置为0
例如11010用00001可以全部处理
int a[64];
int get(int x)
{
return x==1?0:1+get(x>>1);
}
signed main()
{
IOS;
//file();
int t;
cin>>t;
while(t--)
{
memset(a,0);
int n,m,ans=0;
cin>>n>>m;
while(m--)
{
int num;
cin>>num;
a[get(num)]++;
}
for(int i=0;i<63&&n;i++)
{
if(a[i]==0)
continue;
int num=(1ll<<i);
if(n&num)
{
a[i]--;
n-=num;
}
if(lowbit(n)<num&&a[i]&&n)
{
int temp=lowbit(n);
while(temp!=num)
{
num/=2,ans++;
if(n&num)
n-=num;
}
a[i]--;
}
a[i+1]+=a[i]/2;
}
cout<<(n?-1:ans)<<endl;
}
return 0;
}