题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2146
题意:其实就是一个有序的LED板上,求总少有多少个LED灯才能让给定的LED排列之间能够区分(即唯一)
思路:状压枚举究竟是哪几块LED灯能够工作,然后&给定序列,保存下来,最后看唯一的个数是否和序列数相等,相当就更新答案
AC代码:
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e5 + 5;
const int INF = 0x3f3f3f3f;
int a[MAXN];
int main() {
int t;
scanf("%d", &t);
while (t--) {
int p, n;
scanf("%d %d", &p, &n);
memset(a, 0, sizeof(a));
int dd = pow(2, p - 1);
for (int i = 0; i < n; i++) {
int num = dd;
for (int j = 0; j < p; j++) {
int c;
scanf("%d", &c);
a[i] += c * num;
num >>= 1;
}
}
set<int> s;
int ans = 213122;
for (int i = 0; i < (1 << p); i++) {
if (i == (1 << p) - 1) {
printf("");
}
s.clear();
for (int k = 0; k < n; k++) {
s.insert(i&a[k]);
}
if (s.size() == n) {
int temp = i;
int cnt = 0;
while (temp) {
if (temp & 1)cnt++;
temp >>= 1;
}
ans = min(ans, cnt);
}
}
printf("%d\n", ans);
}
return 0;
}