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

int codi[101][16];
int A[15+5];
int min;

int main()
{
  //freopen("11205.in","r",stdin);
  //freopen("11205.out","w",stdout);

  int t;
  scanf("%d",&t);
  while(t-->0)
  {
    min=20;
    int p,n;
    scanf("%d%d",&p,&n);
    for(int i=0;i<n;++i)
     for(int j=0;j<p;++j)
     {
       scanf("%d",&codi[i][j]);
     }
    print_subset(p,n,A,0);
    printf("%d\n",min);
  }
  return 0;
}

void print_subset(int p,int n,int *A, int cur)
{
  if(cur && have_same(cur,n)==false) min=cur<min?cur:min;

  int s=cur?A[cur-1]+1:0;
  for(int i=s;i<p;++i)
  {
    A[cur]=i;
    print_subset(p,n,A,cur+1);
  }
}

bool have_same(int cur,int n)
{
  for(int i=0;i<n;++i)
  {
    for(int j=i+1;j<n;++j)
    {
      bool flag=true;//标记codi数组的第i行与第j行是否相同
      for(int m=0;m<cur;++m)
      {
        if(codi[i][A[m]]!=codi[j][A[m]]) { flag=false; break;}
      }
      if(flag) return true;
    }
  }
  return false;
}
时间: 2024-10-15 20:09:50

UVa 11205 损坏的步数计的相关文章

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

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

The Broken Pedometer UVA 11205

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

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

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

子集生成——暴力求解,枚举

子集生成:给定一个集合,枚举它所有可能的子集.(简单起见,这里假设集合中没有重复元素) 一.增量构造法 思路:一次选出一个元素放到集合中. Code: void print_subset1(int n, int *A, int cur) {//增量构造法 for(int i=0;i<cur;++i) printf("%d ",A[i]); printf("\n"); int s=cur ? A[cur-1]+1 :0;//确定当前元素的最小可能值 for(in

[2016-02-24][UVA][1601][The Morning after Halloween]

时间:2016-02-24 15:49:41 星期三 题目编号:UVA 1601 题目大意:给定一个迷宫图,至多3个小写字母和等数目大写字符,求小写字母移动到大写字母的最少步数 迷宫宽度范围是4~16,字母个数是1~3, 分析:求最少步数,BFS,知道终点状态,可以用双向bfs优化 方法:BFS //单向bfs #include<iostream> #include<cstdio> #include<queue> #include<cstring> #inc

UVa 1252 - Twenty Questions(记忆化搜索,状态压缩dp)

题目链接:uva 1252 题意: 有n个长度为m的二进制串,每个都是不同的. 为了把所有字符串区分开,你可以询问,每次可以问某位上是0还是1. 问最少提问次数,可以把所有字符串区分开来. 思路来源于:点击打开链接 思路: m很小,可以考虑状态压缩. dp[s1][s2]表示询问的状态为s1时,此时能猜到状态包含s2时最小需要的步数. 当询问的几位=s2的二进制串小于2时就能区分出来了,dp[s1][s2]=0: 不能区分则再询问一次,s1|=(1<<k),如果问某位为0,则s2不变,问某位为

UVA 11374 Airport Express 机场快线 Dijistra+路径

题目链接:UVA 11374 Airport Express Airport Express Time Limit: 1000MS   Memory Limit: Unknown   64bit IO Format: %lld & %llu [Submit]   [Go Back]   [Status] Description Problem D: Airport Express In a small city called Iokh, a train service, Airport-Expr