zoukankan      html  css  js  c++  java
  • 【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);
    	}
    }
    
  • 相关阅读:
    系统安全及应用
    进程和计划任务管理
    Java技术体系
    开机十步和进程管理
    Raid
    LVM逻辑卷
    sed命令
    磁盘管理
    你的背景,是这个时代 张璁
    别将梦想停留在二十岁
  • 原文地址:https://www.cnblogs.com/hello-tomorrow/p/11998530.html
Copyright © 2011-2022 走看看