【51Nod】1315 - 合法整数集(思维)
2017-02-27 21:56
274 查看
题目链接:点击打开题目
题解:对给出的数进行观察,如果某二进制位为0,那么所有此二进制位为1的数都可以不删除;如果某二进制位为1,那么统计该位为1的数量。然后取这些数量最小的即可。(写完题解突然发现我的代码可以优化很多QwQ)(手懒就不优化了)
代码如下:
题解:对给出的数进行观察,如果某二进制位为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; }
相关文章推荐
- 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 合法整数集(思维 + 模拟)
- 51nod 1315 合法整数集
- 51nod 1315 合法整数集(位运算)
- 51nod 1315 合法整数集
- 51Nod 1315 合法整数集
- 51nod 1315 合法整数集
- 51Nod-合法整数集(位运算)
- 51 Nod 1315 合法整数集