菜菜

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

  题意:

至少用多少列来表示输入中的二进制数,并且表示的数里面没有重复,最多P列,N个二进制数

所以......表示的最大二进制数是2^P,那么在2^P方内的数二进制最大值是P个1,最小是0,所以,枚举2^P次方内的数k.和输入的二进制余,判断是否会重复,

如果没有重复,把k里面二进制是1的拿出来就是我们枚举的列

#include<stdio.h>
#include<iostream>
#include<sstream>
#include<queue>
#include<map>
#include<memory.h>
#include <math.h>
#include<time.h>
#include <stdlib.h>
#include <algorithm>
using namespace std;
#define N 10
#define P 15
int a[N];
int b[1000];
int vis[N];

int main(const int argc, char** argv)
{
	freopen("d:\\1.txt", "r", stdin);
	int t1, p, n;
	cin >> t1;
	while (t1--)
	{
		memset(a, sizeof(a), 0);
		cin >> p >> n;
		for(int i = 0; i < n; i++)
		{
			int t2;
			for(int j = 0; j < p; j++)
			{
				cin >> t2;
				a[i] = a[i] * 2 + t2;
			}
		}
		int ans = 20;
		for(int i = 0; i < (1 << p); i++)
		{
			int flag = 0;
			int k = 0;
			for(int j = 0; j < n; j++)
			{
				int k2 = i & a[j];
				for(int k3 = 0; k3 < k; k3++)
					if(b[k3] == k2)
					{
						flag = 1;
						break;
					}
				b[k++] = k2;
			}
			if(!flag)
			{
				int t = 0;
				for(int kk = 0; kk < p; kk++)
				{
					if(i & (1 << kk))
						t++;
				}
				ans = t < ans ? t : ans;
			}
		}
		cout << ans << endl;
		ans = 20;
	}
}

  

 

posted on 2017-11-15 00:57  好吧,就是菜菜  阅读(202)  评论(0编辑  收藏  举报