zoukankan      html  css  js  c++  java
  • 二进制拆分+贪心——cf1303D

    /*
    先把n二进制拆分,用map保存a[i]出现次数
    然后从低位到高位去凑n
    对于n某位是1的位数i 
        考虑mp里是否有1<<i 
        如果没有,考虑mp里比i低位的数能否凑出i, 
        如果还是没有,就从高位去拆,只有这种情况下,才会对答案有贡献
    */
    #include<bits/stdc++.h>
    using namespace std;
    #define ll long long 
    ll n,m,a[100005],b[65];
    map<ll,ll>mp;
    
    int main(){
        int t;cin>>t;
        while(t--){
            cin>>n>>m;
            mp.clear();
            memset(b,0,sizeof b);
            
            ll sum=0;
            for(int i=1;i<=m;i++)
                cin>>a[i],mp[a[i]]++,sum+=a[i];
            for(int i=60;i>=0;i--)if((n>>i) & 1)b[i]=1;
                
            if(sum<n){puts("-1");continue;}
            
            ll ans=0;
            ll tot=0;//多余量 
            for(int i=0;i<=60;i++)
                if(b[i]){
                    if(mp[(1ll<<i)]){
                        mp[(1ll<<i)]--;
                        tot+=(1ll<<i)*mp[(1ll<<i)];
                        mp[(1ll<<i)]=0;
                    }
                    else if(tot>=(1ll<<i)){//可以从多余量里凑 
                        tot-=(1ll<<i);
                    }
                    else {//必须从高阶拆 
                        ll cur=(1ll<<i);
                        ll j=cur;
                        while(1){
                            if(mp[j]!=0){
                                mp[j]--;
                                break;
                            }
                            j<<=1;
                        } 
                        while(j!=cur){
                            ans++;
                            j>>=1;
                            mp[j]++;
                        }
                        tot+=cur; 
                    }
                }else {
                    tot+=mp[(1ll<<i)]*(1ll<<i);
                }
            cout<<ans<<'
    '; 
        }
        return 0;
    }
  • 相关阅读:
    Tomcat基本使用
    XML、java解释XML、XML约束
    配置文件的读取
    jdbc操作数据库以及防止sql注入
    java中的枚举类
    maven阿里云中央仓库
    spring boot&&cloud干货系列
    数据库 锁机制
    MySql的优化步骤
    MYSQL 索引无效和索引有效的详细介绍
  • 原文地址:https://www.cnblogs.com/zsben991126/p/12302048.html
Copyright © 2011-2022 走看看