【HDU6344】调查问卷【状压】【模拟】

题目大意:

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6344
给出nn个答卷,每个答卷有mm道判断题,全部由AABB组成。这mm道判断题里有多少个题目子集,满足至少有kk对试卷在这些问题上面的答案是不同的。


思路:

m10m\leq 10,可以考虑先状压。
a[i]a[i]为第ii张试卷压缩后的状态,那么枚举一个题目子集SS,将SS与所有试卷进行与运算,并记录进一个hh数组。如果现在枚举到第jj张试卷,h[S&a[j]]h[S\&a[j]]kk个,那么就有jkj-k张试卷可以和第jj张试卷匹配。最终判断匹配数,如果超过要求,这个子集就是可以的,ansans加一。


代码:

#include <cstdio>
#include <iostream>
#include <cstring>
#define N 1010 
#define MAXN 1023
using namespace std;

int t,n,m,k,sum,ans,a[N],h[MAXN+10];
char c;

int main()
{
	scanf("%d",&t);
	for (int l=1;l<=t;l++)
	{
		scanf("%d%d%d",&n,&m,&k);
		memset(a,0,sizeof(a));
		for (int i=1;i<=n;i++)
		 for (int j=m-1;j>=0;j--)
		 {
		 	cin>>c;
		 	if (c=='A') a[i]+=(1<<j);  //状压
		 }
		ans=0;
		for (int i=1;i<(1<<m);i++)
		{
			sum=0;
			memset(h,0,sizeof(h));
			for (int j=1;j<=n;j++)
			{
				h[i&a[j]]++;  //记录个数
				sum=sum+(j-h[i&a[j]]);
			}
			if (sum>=k) ans++;
		} 
		printf("Case #%d: %d\n",l,ans);
	}
}
posted @ 2018-10-07 16:22  全OI最菜  阅读(84)  评论(0编辑  收藏  举报