题目链接:http://codeforces.com/contest/467/problem/B
题意:m+1个玩家,n种不同类型的士兵,玩家从1~m+1编号,士兵的类型由0~n-1编号,第i个玩家的军队可以由一个非负整数x[i]表示,考虑用二进制表示x[i],如果x[i]的第j位是1,那么第i个玩家有第j种士兵,如果两个玩家的士兵的不同种类不超过k,他们可以成为盟友,求第m+1有多少个盟友。
题解:也就是给你m+1个数让你判断所给数的二进制形式与第m+1个数不相同的位数是不是小于等于k,是的话就累计起来。要知道位运算的用法
补充:“<< ” 位左移,相当于乘以2
“>>" 位右移,相当于除以2
“&” 按为与,位数都为1时为1,否则为0
“^” 异或,不同为1,相同为0
AC代码:
#include<stdio.h>
#include<math.h>
#include<algorithm>
using namespace std;
int main()
{
int n,m,k,x[1010],i,ans,j;
ans=0;
scanf("%d%d%d",&n,&m,&k);
for(i=1;i<=m+1;i++)
scanf("%d",&x[i]);
for(i=1;i<=m;i++)
{
int temp=0;
for(j=0;j<n;j++)
if((x[i]&(1<<j))^(x[m+1]&(1<<j))) temp++;
if(temp<=k) ans++;
}
printf("%d\n",ans);
}