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来实现这个思路,时间有些极限