题目链接:点击打开题目
题解:对给出的数进行观察,如果某二进制位为0,那么所有此二进制位为1的数都可以不删除;如果某二进制位为1,那么统计该位为1的数量。然后取这些数量最小的即可。(写完题解突然发现我的代码可以优化很多QwQ)(手懒就不优化了)
代码如下:
#include <cstdio>
#include <cstring>
#include <queue>
#include <cmath>
#include <stack>
#include <vector>
#include <algorithm>
using namespace std;
#define INF 0x3f3f3f3f
#define CLR(a,b) memset(a,b,sizeof(a))
#define PI acos(-1.0)
#define LL long long
int main()
{
// freopen("C:\\Users\\Wolf\\Desktop\\output.txt","w",stdout);
int n,m;
LL k,x,y;
LL t1,t2;
int ant[35];
CLR(ant,0);
scanf ("%d %lld",&n,&k);
for (int i = 0 ; i < n ; i++)
{
t2 = k;
scanf ("%lld",&t1);
m = 1;
queue<int> q;
bool flag = true; //记录是否是需处理数据
while (t1)
{
x = t1 & 1;
y = t2 & 1;
if (x && (!y)) //有这个数不影响结果
{
flag = false;
break;
}
else if (x && y)
q.push(m);
t1 >>= 1;
t2 >>= 1;
m++;
}
if (flag)
{
while (!q.empty())
{
ant[q.front()]++;
q.pop();
}
}
}
int p = 1;
int ans = INF;
while (k)
{
if (k & 1)
ans = min(ans , ant[p]);
p++;
k >>= 1;
}
printf ("%d\n",ans);
return 0;
}