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; }
相关文章推荐
- 51nod 1315 合法整数集
- 51nod 1315 合法整数集
- 51nod-【1315 合法整数集】
- 51nod 1315 合法整数集
- 51nod 1315 合法整数集
- 51nod 1315 合法整数集
- 51nod 1315 合法整数集
- 51nod 1315 合法整数集
- 【51Nod】1315 - 合法整数集(思维)
- 51nod 1315 合法整数集(位运算)
- 51nod 1315 合法整数集
- 51nod-1315 合法整数集
- 51nod 1315 合法整数集问题(预处理)
- 51nod 1315 合法整数集
- 51Nod-1315-合法整数集
- 51Nod-1315 合法整数集
- 51Nod 1315 合法整数集
- 51 NOD 1315 合法整数集(思维 + 模拟)
- 1315 合法整数集
- 51Nod-合法整数集(位运算)