oj:http://lx.lanqiao.cn/problem.page?gpid=T519
蓝桥杯的题,比较简单的一个题目,因为画最多只有20幅,且小朋友的判断只存在两种状态,所以可以直接使用一个二进制数来表示一个小朋友的判断,这样就可以非常简单了保存所有小朋友的判断结果,且利用"^"运算符,也能非常简单的判断两个小朋友的判断是否完全不相同。
需要注意的是,题目中说的是完全相反。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define MAX 1100000
// i位置保存判断类型为i的小朋友的个数
int vis[MAX];
int main()
{
int n,m;
int res = 0;
scanf("%d%d",&n,&m);
int max = pow(2,m);
sizeof(vis,0,sizeof(vis));
int i=0,j=0;
for(;i<n;i++){
int f = 0;
for(j=0;j<m;j++){
int b;
scanf("%d",&b);
f = f << 1;
f = f | b;
}
vis[f]++;
}
for(i=0;i<max;i++){
if(vis[i]){
// 获取完全相反的状态
int f = i^(max-1);
// 判断对应位置是否有小朋友
if(vis[f]){
res += vis[f] * vis[i];
// 判断了f之后,将f位置变为0,避免重复计数
vis[f] = 0;
}
}
}
printf("%d\n",res);
return 0;
}