请求思路纠错
查看原帖
请求思路纠错
128461
SaturdayForever楼主2022/6/21 22:31

总之,日前尚未掌握状压 dp 的时候

有了一个朴素的想法,将对每一位的询问结果做一次状压

211=20482^{11} = 2048 询问方式存在一个 int q 里,然后将每一个物体 aia_i & q=bi q = b_i , 看 bib_i 有没重复,有重复就不能区分,没重复就可以猜到。

样例都过不了,有组数据比标答大 1 ,贴个代码

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int main(){
	int n,m,x[136] = {0};
	char s[16];
	while(scanf("%d%d",&m,&n) == 2){
		if(n == 0 && m == 0) break;
		memset(x,0,sizeof(x));
		for(int i = 1;i <= n;i++){
			scanf("%s",s);
			for(int j = 0;j < m;j++){
				x[i] = x[i]*2 + s[j] - 48;
			}
			cerr << x[i] << " ";
		}
		/*if(n == 1){
			printf("0\n");
			continue;
		}
		if(n == 2){
			printf("1\n");
			continue;
		}
		//cerr << 233;*/
		int C = 1 << m,ans = m;
		for(int ii = 0;ii < C;ii++){
			int f[C+1] = {0},cnt = 0;
			for(int t = ii;t;t >>= 1)
				cnt += t&1;
			//cerr << cnt <<" ";
			if(cnt > ans){cerr << "!"; continue;}
			for(int i = 1;i <= n;i++){
				int t = x[i] & ii;
				f[t]++;
				if(f[t] > 1){
					cnt = 233;
					break;
				}
			}2
			if(ans > cnt)
				ans = cnt;
		}
		printf("%d\n",ans);
		cerr<<endl;
	}
	return 0;
}
2022/6/21 22:31
加载中...