ロックリソースの合理的な割り当て

1424 ワード

问题详述:ある部门は电子ロックを取り付けて、M人の従业员の中で1人1枚の磁気カードを出すことを要求して、カードの上でロックを解除する磁気ストライプがあって、安全を确保するために、必ず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;

	}

}