[关闭]
@Metralix 2016-12-08T02:07:32.000000Z 字数 535 阅读 750

J - Fedor and New Game

二进制 c++ 位运算


题目大意

给你m+1个数让你判断所给的数的二进制形式与第m+1个数不想同的位数是否小于等于k,累计答案

解题思路

这里用到了一个很关键的二进制的知识: a & (1 << j ) 表示数a二进制的第j位是什么。

有了这个,题目就变得很简单啦,只要一个for循环m-1个数,嵌套一个for循环n位数,判断一下即可。
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <algorithm>
  5. using namespace std;
  6. const int maxn = 1010;
  7. int num[maxn], cnt;
  8. int main() {
  9. int n, m, k;
  10. scanf("%d%d%d", &n, &m, &k);
  11. for (int i = 0; i < m; i++)
  12. scanf("%d", &num[i]);
  13. scanf("%d", &cnt);
  14. int ans = 0;
  15. for (int i = 0; i < m; i++) {
  16. int cur = 0;
  17. for (int j = 0; j < n; j++)
  18. if (((1<<j)&num[i]) != ((1<<j)&cnt))
  19. cur++;
  20. if (cur <= k)
  21. ans++;
  22. }
  23. printf("%d\n", ans);
  24. return 0;
  25. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注