void solve(){
int n,k;cin>>n>>k;
map<int,int> mp;
for(int i=1;i<=n;i++){
int x;cin>>x;
while(x<=k){
mp[x]++;
x*=2;
}
}
int sum=0,cnt=0;
for(auto[x,xCnt]:mp){
if(sum>k)break;
if(sum+x*xCnt<=k){
sum+=x*xCnt;cnt+=xCnt;
}else{
int addCnt=(k-sum)/x;
cnt+=addCnt;
break;
}
}
cout<<cnt<<endl;
}
非队列做法:
因为每次使用之后数值都会翻倍,那么每个数最多会被翻倍 log_2(K)次,那么我们直接将所有的可能的数都存入一个集合中,然后对这个集合进行排序,取最小的那一部分即可,时间复杂度为 O(nlog(k)log(nlog(k) ) )
代码里用map来实现这个思路,时间有些极限

京公网安备 11010502036488号