题目:给你p个LED组成的相同的显示器n个,每个显示器上显示一个符号(LED的p长度的01串)
问最少使用p位中的几个位,就能区分这n个不同符号,均不相同即可(其他位当做置0处理)
分析:搜索、枚举。从保留1位开始,一直搜索到p为,出现满足题意的解就退出,即可。
枚举采用位运算,提高效率。
说明:寻找相同的时候,先排序,再判断相邻的即可(n lg(n));也可以使用hash提高效率。
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstdio>
using namespace std;
int S[104];
int P[104];
int main()
{
int T,N,M,a,b;
while ( ~scanf("%d",&T) )
for ( int t = 1 ; t <= T ; ++ t ) {
scanf("%d%d",&N,&M);
for ( int i = 0 ; i < M ; ++ i ) {
b = 0;
for ( int j = 0 ; j < N ; ++ j ) {
scanf("%d",&a);
b <<= 1;
b += a;
}
S[i] = b;
}
for ( int k = 1 ; k <= N ; ++ k ) {
int xx,yy,comb = (1<<k)-1,flag = 0;
while ( comb < (1<<N) ) {
/* 计算当前状态对应的集合 */
for ( int i = 0 ; i < M ; ++ i )
P[i] = S[i]&comb;
flag = 1;
sort( P, P+M );
for ( int i = 1 ; i < M ; ++ i )
if ( P[i] == P[i-1] ) {
flag = 0; break;
}
if ( flag ) {
printf("%d\n",k);
break;
}
/* 位运算计算下一集合,按照顺序递增 */
xx = comb&-comb,yy = comb+xx;
comb = ((comb&~yy)/xx>>1)|yy;
}
if ( flag ) break;
}
}
return 0;
}
UVa 11205 - The broken pedometer,布布扣,bubuko.com
UVa 11205 - The broken pedometer
原文地址:http://blog.csdn.net/mobius_strip/article/details/37558449