开始: 2025-09-28 11:00:00

25复赛模拟赛03OI赛制

结束: 2025-09-29 13:30:00
当前  2025-12-02 11:13:02  类型: OI  状态: 已经结束 

#include<cmath>
#include<cstdio>
#include<cstring>
#include<queue>
#include<bits/stdc++.h>
#include<iostream>
#include<algorithm>
using namespace std;
#define LL long long
#define int long long
const int mod=998244353;

LL m,tot,qS[65],cnt[65],a[100005];
int n,ans;
bool f[65];
void solve(){
	ans=0;
	for(int i=0;i<=62;i++){
		if((1ll<<i)&m)f[i]=1;
		else f[i]=0;
	}
	qS[0]=cnt[0];
	for(int i=1;i<=62;i++)qS[i]=qS[i-1]+1ll*((1ll<<i)*cnt[i]);
	LL S=0;
	for(int i=0;i<=62;i++){
		if(f[i]){
			if((1ll<<i)>qS[i]-S){
				bool f=0;
				for(int j=i+1;j<=62;j++){
					if(cnt[j]){
						f=1;
						ans+=j-i;
						cnt[j]--,cnt[i]+=2;
						for(int k=i+1;k<j;k++)cnt[k]++;
						break;
					}
				}
				if(!f){
					puts("-1");
					return ;
				}
			}
			qS[0]=cnt[0];
			for(int j=1;j<=62;j++)qS[j]=qS[j-1]+1ll*((1ll<<j)*cnt[j]);
			S+=(1ll<<i);
		}
	}
	printf("%d\n",ans);
}
int t;
signed main(){ 
//	freopen("cake.in","r",stdin);
//	freopen("cake.out","w",stdout);
	t=1;
	while(t--){
		scanf("%lld %d",&m,&n);
		tot=0;
		memset(cnt,0,sizeof cnt);
		for(int i=1;i<=n;i++)scanf("%lld",&a[i]),tot+=a[i];
		int ans1=0,ans2=0;
		if(tot<m){
			puts("-1");
			continue;
		}
		for(int i=1;i<=n;i++){
			LL x=a[i];
			int res=0;
			while(x!=1){
				x/=2;
				res++;
			}
			cnt[res]++;
		} 
		solve();	
	}
	return 0;
    
} 
/*
考虑 
*/