nssl1185-试卷【状态压缩】

版权声明:原创,未经作者允许禁止转载 https://blog.csdn.net/Mr_wuyongcong/article/details/82958042

正题


题目大意

有n张试卷m道题,给出每张试卷每道题的答案(A或B),选择若干道题,要求至少有k对试卷这些题的选择不一样(只要有一题不一样就行)


解题思路

用二进制码表示试卷,用1表示A,0表示B。
然后用二进制码枚举这些题的选择方案,用1表示选,0表示不选。
然后 \vee 一下就可以单独得出每张试卷这些题的选择。
之后直接比较就可以得知选择是否相同。
我们可以用一个同 v i v_i 选择的表示为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);
	}
}

猜你喜欢

转载自blog.csdn.net/Mr_wuyongcong/article/details/82958042