您的位置:首页 > 其它

【51Nod】1315 - 合法整数集(思维)

2017-02-27 21:56 274 查看
题目链接:点击打开题目



题解:对给出的数进行观察,如果某二进制位为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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  二进制