称号:给你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; }
版权声明:本文博客原创文章,博客,未经同意,不得转载。
本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/4677838.html,如需转载请自行联系原作者