HDU 3006

这题就是用一个二进制数保存一个集合的元素 比如一个集合中有两个元素   1  3   那就用5 (101)表示这个集合

 就是用0 1 来表示这个集合中一个数存不存在 再比如 一个集合有 三个元素 1 4 5 就在这几个位子上标为1,那就

 

用25 (11001)来表示这个集合!在借助于位运算的或( |  )就可已达到合并集合的目的,比如一个集合(1 4 )

 

和一个集合(1 2 3)进行合并 那就是  (9)1001 | 111(7)=1111  就是15  这样就将重复的部分覆盖了。新的集合就用15来表示!最大就是(11111111111111)2^15-1来表示一个集合!

 

#include<stdio.h>
#include<string.h>
int a[1<<15];
int
main()
{

int
n,k,y,m,x,ans,i;
while
(scanf("%d %d",&n,&m)!=EOF)
{

   memset(a,0,sizeof(a));
   ans=0;
   while
(n--)
     {

      scanf("%d",&k);y=0;
            while
(k--)
            {

             scanf("%d",&x);
               y=y|(1<<(x-1));// 把每一个集合所代表的值算出来!
              }

             //用循环  或运算进行集合合并!
             a[y]=1;
             for
(i=0;i<=(1<<14);i++)
             if
(a[i])
             a[ i | y ]=1;       }


      for
(i=0;i<=(1<<14);i++)
      if
(a[i])
      ans++;
      printf("%d\n",ans);
}

return
0;
}

 

 

这题不是自己做的事别人的思路

posted @ 2013-08-02 08:18  hpu张亚飞  阅读(117)  评论(0编辑  收藏  举报