Shirlies
宁静专注认真的程序媛~

英文一大串,磨死人啊~~~

题目大致是想说:找到一个P位的二进制数和给的二进制数与,得到的n个二进制数是不同的,但是呢,这个p位的二进制数1的个数要最小就是了(自己的理解)

代码如下:

//#define LOCAL
#include "stdio.h"
#include "string.h"

int p[150];
int s[150][20];
int sf[150];

int differ(int *p,int m)
{
 int i,j;
 for(i=0;i<m;i++)
 {
  for(j=i+1;j<m;j++)
  {
   if(p[i]==p[j])
    return 0;
  }
 }
 return 1;
}

int main()
{
#ifdef LOCAL
 freopen("input.in","r",stdin);
 freopen("output.out","w",stdout);
#endif
 int t;
 int n,m,count,min;
 int i,j,k,v;
 
 scanf("%d",&t);
 while(t--)
 {
  scanf("%d%d",&n,&m);
  count=0;
  min=20;
  
  memset(s,0,sizeof(s));
  memset(sf,0,sizeof(sf));
  
  for(i=0;i<m;i++)
  {
   for(j=0;j<n;j++)
   {
    scanf("%d",&s[i][j]);
   }
  }
  
  for(j=0;j<m;j++)
  {
   for(k=0;k<n;k++)
   {
    sf[j]+=(s[j][k]<<(n-k-1));
   }
  }
  
  
  for(i=1;i<(1<<n);i++)
  {
            count =0;
   memset(p,0,sizeof(p));
   
   for(j=0;j<m;j++)
   {
    p[j]=(i&sf[j]);
   }
   
   if(differ(p,m))
   {
    for(j=0;j<n;j++)
    {
     if((i>>j)&1)
      count++;
    }
    if(count<min)
     min=count;
   }
  }
  
  
  
  printf("%d\n",min);
 }
 
 return 0;
}

其实可以省掉一个数组s的,将前面两个双for循环语句合并的^_^

posted on 2012-02-05 16:20  Shirlies  阅读(451)  评论(0编辑  收藏  举报