D. Fill The Bag-(位运算+贪心)

总结

贪心的思路是对,但是有几个点处理导致一直WA

问题

1:二进位低位可以往高位升级
例如 1 1 1 1进化2 2进化4
2:pos位存在,可以把n的pos位以前的所有位置为0
例如1101000001可以全部处理

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;
}
发布了130 篇原创文章 · 获赞 5 · 访问量 4987

猜你喜欢

转载自blog.csdn.net/weixin_44224825/article/details/104291984
今日推荐