版权声明:原创,未经作者允许禁止转载 https://blog.csdn.net/Mr_wuyongcong/article/details/82958042
正题
题目大意
有n张试卷m道题,给出每张试卷每道题的答案(A或B),选择若干道题,要求至少有k对试卷这些题的选择不一样(只要有一题不一样就行)
解题思路
用二进制码表示试卷,用1表示A,0表示B。
然后用二进制码枚举这些题的选择方案,用1表示选,0表示不选。
然后
一下就可以单独得出每张试卷这些题的选择。
之后直接比较就可以得知选择是否相同。
我们可以用一个同
选择的表示为i的试卷个数,然后用总对数减去多出来对数就可以得到有多少对试卷不一样。
code
#include<cstdio>
#include<cstring>
#include<iostream>
#define MS 1024
#define N 1010
using namespace std;
int t,n,m,k,v[MS],a[N],ans,answer;
char c;
int main()
{
scanf("%d",&t);
for(int ti=1;ti<=t;ti++)
{
answer=0;
memset(a,0,sizeof(a));
scanf("%d%d%d",&n,&m,&k);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
cin>>c;
a[i]=a[i]*2+(c=='A');//转换
}
for(int s=0;s<(1<<m);s++)//枚举状态
{
ans=0;
memset(v,0,sizeof(v));
for(int i=1;i<=n;i++)//枚举试卷
{
v[a[i]&s]++;//统计
ans+=i-v[a[i]&s];//容斥
}
if(ans>=k) answer++;
}
printf("%d\n",answer);
}
}