The broken pedometer
题目链接:
http://acm.bnu.edu.cn/bnuoj/problem_show.php?pid=19623
题目大意:
7 10 1 1 1 0 1 1 1 0 0 1 0 0 1 0 1 0 1 1 1 0 1 1 0 1 1 0 1 1 0 1 1 1 0 1 0 1 1 0 1 0 1 1 1 1 0 1 1 1 1 1 0 1 0 0 1 0 1 1 1 1 1 1 1 1 1 1 1 0 1 1有7盏LED灯,开着表示1,关着表示0。用这7盏灯表示出10个不同的数,现在问最少可以用多少盏灯,就能够将这10个不同的数分辨出来
解题思路:
由于LED灯最多为15,用二进制枚举,一共就2^15种,再加上对每种情况进行判断,是否能够表示出不同的数,最多每组100次比较,所以时间复杂度为10^6左右,暴力可以完成。
代码:
#include<iostream>
#include<fstream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<map>
#include<queue>
#include<stack>
#include<vector>
#include<set>
#include<ctype.h>
#include<algorithm>
#include<string>
#define PI acos(-1.0)
#define maxn 1000
#define INF 1<<25
#define mem(a, b) memset(a, b, sizeof(a))
typedef long long ll;
using namespace std;
int n, a[105], p;
void dfs()
{
int i, j, t = 1 << p, mn = p + 1;
for (i = 0; i < t; i++)
{
j = i;
int ge = 0;
while(j > 0)
{
ge += j & 1;
j = j >> 1;
}
if (ge >= mn) continue;
int bj[33000] = {0};
for (j = 0; j < n; j++)
{
int k = a[j] & i;
if (!bj[k]) bj[k] = 1;
else break;
}
if (j == n) mn = ge;
}
printf("%d\n", mn);
return ;
}
int main ()
{
int t, i, j, k;
cin>>t;
while(t--)
{
scanf("%d%d", &p, &n);
for (i = 0; i < n; i++)
{
a[i] = 0;
for (j = 0; j < p; j++)
{
scanf("%d", &k);
a[i] = a[i] * 2 + k;
}
}
dfs();
}
return 0;
}