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;
}

UVa 11205 - The broken pedometer,布布扣,bubuko.com

时间: 2024-10-22 02:01:48

UVa 11205 - The broken pedometer的相关文章

UVA 11205 The broken pedometer(子集枚举)

B - The broken pedometer Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit Status Appoint description:  System Crawler  (2014-05-18) Description  The Broken Pedometer  The Problem A marathon runner uses a pedometer with wh

uva 11205 The broken pedometer (暴力)

uva 11205 The broken pedometer The Problem A marathon runner uses a pedometer with which he is having problems. In the pedometer the symbols are represented by seven segments (or LEDs): But the pedometer does not work properly (possibly the sweat aff

uva 11205 The broken pedometer(暴力枚举+子集生成)

我终于可以说这是我自己独立完成的题目了,没看题解,没看注释,虽然用的时间成了写,总归有成就感的,昨天晚上就写了个大概,有点bug,由于太晚了,而且有点困了,就去睡了,当时真是自己认真想了的,,很深入的想了,用的书上刚学会的位向量自己生成来判断的.以后都要努力自己想,自己解决,专注...深入.... 思路: 就是先算出最少用m个灯才能表示n个数字,然后找第一个数字(由许多灯组成的0,1序列)的个数为m的子 集,把这n个子集作为n个数字的下标,判断一下有没有玩去一样的,如果有的话证明这两个数字不能通

UVa 11025 The broken pedometer【枚举子集】

题意:给出一个矩阵,这个矩阵由n个数的二进制表示,p表示用p位二进制来表示的一个数 问最少用多少列就能将这n个数区分开 枚举子集,然后统计每一种子集用了多少列,维护一个最小值 b[i]==1代表的是选择了这一列 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include <cmath> 5 #include<stack> 6 #include<vector&g

The Broken Pedometer UVA 11205

说说: 这题开始的时候理解有错误,以为只要对每个位进行判断,即如果每个数的该位都不考虑,若出现两个数字完全相同,则该位是必须存在的,否则即是可有可无的.但是这么做其实是有问题的,因为这就默认对于某位的判断是基于其他位都是有效的情况.而事实上应当在将无效位全都去除之后,再对需要判断的位进行判断才是合理的,但这明显不能满足.因此在网上也看了一些其他人的解题报告,最简单的应该就是用位向量的方法了.即把P位数的每个位是否有效进行排列组合,列出所有情况进行判断,进行暴力求解即可. 源代码: #includ

UVa 11205 损坏的步数计

题意:有一组编码,用其中最少的位数来区分这些编码. 思路:相当于枚举一个集合的所有子集,然后选择符合要求的势最小的集合. 子集生成有三种方法,但每一种子集的生成都没有明显的规律,至少不是从1个元素.2个元素到n个元素这样的顺序生成的,所以还是要枚举出所有的子集才行.这里用的增量构造法来枚举子集. Code: #include<stdio.h> void print_subset(int p,int n,int *A, int cur); bool have_same(int cur,int n

uva11205 The broken pedometer 子集生成

PS:此题我在网上找了很久的题解,发现前面好多题解的都是没有指导意义的.后来终于找到了一篇好的题解. 好的题解的链接:http://blog.csdn.net/u013382399/article/details/23516051 我在他的解题的基础上,有了自己的理解. 题意: 有n(100以内)个位数为p(15以内)的二进制数,最少需要几个二进制位就可以把他们区分开. 题目分析: 数据较小,用的是暴力的方法,就是枚举每一个二进制位取或不取.就是相当于是枚举矩阵的列. 刘汝佳的小白书120页提到

uva11025--The broken pedometer

/*刚开始题目没怎么看懂,以为就是将给的n组数据中同时将每一列全部变成0,如果没有重复的,说明此列可去掉.后来发现这样想是不对的,会存在很多错误.仔细读题才发现,这道题的意思是找到一个n位的二进制数i,让它与n组给定的数据进行&操作,如果操作完后n组数据任不同,则i是可取的,但是我们要取的是n为数字中1的数目最少的i.*/ #include"iostream"#include"stdio.h"#include"string.h"#incl

UVA题目分类

题目 Volume 0. Getting Started 开始10055 - Hashmat the Brave Warrior 10071 - Back to High School Physics 10300 - Ecological Premium 458 - The Decoder 494 - Kindergarten Counting Game 414 - Machined Surfaces 490 - Rotating Sentences 445 - Marvelous Mazes