合理分配 “锁”资源

问题描述:某部门要安装电子锁,要求在M个工作人员中每人发一张磁卡,卡上有解锁的磁条,为了确保安全,必须要N个人在一起才能将锁打开,输入M,N  求磁条最小方案。如:

样例输入:

5 3

样例输出:

0111000111
0011111010
1001011101
1100101011
1110110100

 

1代表能解开该处的磁条,0代表不能解开

今天晚上写的太累了,就不解释了,下次加上注释说明。直接上代码:

 

 

#include "iostream"

#include "string"

using namespace std;



bool fun(int num,int col){

	int a = 0;

	while(num>0){

		if(num%2==1) a++;

		num /= 2;

	}

	if(a==col) return true;

	return false;

}



string change(int num,int length){

	string result;

	while(num>0){

		int a = num%2 + '0';

		result.insert(0,1,(char)a);

		num/=2;

	}

	int t = length - result.size();

	result.insert(0,t,'0');

	return result;

}



int main(){

	int m,n;

	cin>>m>>n;

	int lock,openLock,closeLock;

	int t1 = 1,t2 = 1;

	for(int i=0;i<n-1;i++){

		t1 *= (m-i);

		t2 *= (i+1);

	}

	lock = t1/t2;

	int *p = new int[lock];

	int col = m-n+1;

	int temp = 0;

	for(int i=0;i<lock;i++){

		temp++;

		while(!fun(temp,col)){

			temp++;

		}

		p[i] = temp;

	}

	string *ps = new string[lock];

	for(int i=0;i<lock;i++){

		ps[i] = change(p[i],m);

	}

	

	for(int i=0;i<m;i++){

		for(int j=0;j<lock;j++){

			cout<<ps[j][i];

		}

		cout<<endl;

	}

}


 

你可能感兴趣的:(资源)