您的位置:首页 > 其它

51Nod 1315 合法整数集

2018-01-24 12:59 183 查看


这道题 一开始 没有思路 然后 根据他人启发 问我什么要需要删 什么不需要删

什么不需要删 根据 或(|)运算性质 如果 两个数相或 只要任意一位二进制数位为1

那么对应结果二进制位必然 为1 那么这么说 我一个数如果和X相或 是X发生改变了

那么这个数 必然是不要删的 是X二进制数位为0的那一位 经过或运算之后 变成了1

那么 什么需要删呢

把不需要删的数去除

把所有的剩下的数 列成竖式 后 按位加

就比如说 原题 1 2 4 7 8 去除 8 之后 剩下

1 2 4 7 转成二进制

0 0 1
0 1 0
1 0 0
+   1 1 1
----------------
2 2 2


这个意思是什么呢 我们要干什么 ? 最好构造出来一个类似不要删除的数

那么只要我X二进制位上有1 且 对应数位不为0 则 要减掉该数位的个数的数字 才能使这数位为0 从而使最终或成的数不为 X

#include<iostream>
#include<vector>
using namespace std;
vector<int> v;
int lower[32];
int main()
{
int n,x;
cin >> n >> x;
int num;
for(int i=0;i<n;i++){
cin >> num;
if((num|x)>x) continue;
else v.push_back(num);
}
for(int i=0;i<v.size();i++){
int loc =0;
while(v[i]!=0){
lower[loc++]+=(v[i]&1);
v[i]>>=1;
}
}
int ans=0x3f3f3f;
for(int i=0;i<32;i++){
if(lower[i]==0 && (x&1)==1){
ans=0;
break;
}
x>>=1;
if(lower[i]!=0) ans = min(ans,lower[i]);
}
if(ans!=0x3f3f3f) cout << ans << endl;
else cout << 0 << endl;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: