@Metralix
2016-12-08T02:07:32.000000Z
字数 535
阅读 750
二进制
c++
位运算
题目大意
给你m+1个数让你判断所给的数的二进制形式与第m+1个数不想同的位数是否小于等于k,累计答案
解题思路
这里用到了一个很关键的二进制的知识: a & (1 << j ) 表示数a二进制的第j位是什么。
有了这个,题目就变得很简单啦,只要一个for循环m-1个数,嵌套一个for循环n位数,判断一下即可。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 1010;
int num[maxn], cnt;
int main() {
int n, m, k;
scanf("%d%d%d", &n, &m, &k);
for (int i = 0; i < m; i++)
scanf("%d", &num[i]);
scanf("%d", &cnt);
int ans = 0;
for (int i = 0; i < m; i++) {
int cur = 0;
for (int j = 0; j < n; j++)
if (((1<<j)&num[i]) != ((1<<j)&cnt))
cur++;
if (cur <= k)
ans++;
}
printf("%d\n", ans);
return 0;
}