2022河南萌新联赛第(四)场:K.试香(位运算)

https://ac.nowcoder.com/acm/contest/38487/K

题目描述 
给定n个数字,每个数字都是2的幂组成的,也就是1 2 4 8 这样的数字
问我们能不能从里边选一些数字出来组成x?
可以的话就输出选中的个数,以及输出选中的数字的下标
不可以的话就直接输出-1
示例1
2
3 10
2 4 8
3 11
2 4 8
输出
2
1 3
-1
  • 可以知道他们都是2的次幂,所以取按位与不会产生110的情况,只需要核对每一位数组中有没有这个数就行了
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=200200;
LL n,m,a[N];
int main()
{
    //cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
    int T;
    cin>>T;
    while(T--)
    {
        cin>>n>>m;
        map<LL,LL> mp;
        for(LL i=1;i<=n;i++)
        {
            cin>>a[i];
            mp[a[i]]=i;
        }
        vector<LL> v;
        bool flag=true;
        for(LL i=0;i<=60;i++)//2的60次幂是19位
        {
            if(pow(2,i)>m) break;
            if(m>>i&1)//左移取最后一个数字
            {
                //cout<<i<<" sa"<<endl;
                if(mp[pow(2,i)]!=0) v.push_back(mp[pow(2,i)]);
                else
                {
                    flag=false;
                    break;
                }
            }
            if(flag==false) break;
        }
        if(flag==false) cout<<"-1"<<endl;
        else
        {
            cout<<v.size()<<endl;
            for(int i=0;i<v.size();i++)
                cout<<v[i]<<" ";
            cout<<endl;
        }
    }
    return 0;
}
posted @ 2022-08-07 11:32  高尔赛凡尔娟  阅读(18)  评论(0编辑  收藏  举报