UVa 11205 - The broken pedometer

简介:

称号:给你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,如需转载请自行联系原作者


相关文章
uva 11991 - Easy Problem from Rujia Liu?
这个题目的意思是输入n个数,m组询问,每组询问包含两个整数k,v,意思是询问整数v第k次出现的位置。
41 0
|
6月前
UVA —10361—Automatic Poetry
UVA —10361—Automatic Poetry
UVa1531 - Problem Bee
UVa1531 - Problem Bee
51 0
UVa11958 - Coming Home
UVa11958 - Coming Home
47 0
UVa389 - Basically Speaking
UVa389 - Basically Speaking
36 0
uva101 The Blocks Problem
uva101 The Blocks Problem
54 0
uva live 3516 - Exploring Pyramids
点击打开链接 题意:给出一棵多叉树,每个结点的任意两个子节点都有左右之分。从根节点开始,每次尽量往左走,走不通就回溯,把遇到的字母顺序记录下来,可以得到一个序列。
769 0