题目链接:http://codeforces.com/contest/467/problem/B
题目意思:有 m + 1 个 player 和 n 种类型的 soldiers。每个player被赋予一个数xi,然后将xi 看成二进制数,规定第 j 位 如果为1,表示这个 player 有j 这种类型的soldiers。Fedor 是 第 m + 1 个player,问他能跟前面 m 个players 成为 friends 的 人数。成为friends 的条件是被比较的两个人的不同soldiers数不得多于 k 个。
好容易想到方法,就是异或之后统计1的个数。不过数组开小了,被人 hack !而且比赛时间只有一小时,校园网断网!有进步的是,有时间做了下C,虽然是错掉了。
太粗心了,留个纪念吧~~~
1 #include <iostream> 2 #include <cstdio> 3 #include <cstdlib> 4 #include <cstring> 5 using namespace std; 6 7 const int maxn = 1000 + 10; 8 int a[maxn]; 9 10 int main() 11 { 12 int n, m, k; 13 while (scanf("%d%d%d", &n, &m, &k) != EOF) 14 { 15 for (int i = 0; i < m; i++) 16 scanf("%d", &a[i]); 17 scanf("%d", &a[m]); 18 int ans = 0; 19 for (int i = 0; i < m; i++) 20 { 21 int tmp = a[i] ^ a[m]; 22 int cnt = 0; 23 for (; tmp; tmp >>= 1) 24 { 25 if (tmp & 1) 26 cnt++; 27 } 28 if (cnt <= k) 29 ans++; 30 } 31 printf("%d ", ans); 32 } 33 return 0; 34 }