ロックリソースの合理的な割り当て
1424 ワード
问题详述:ある部门は电子ロックを取り付けて、M人の従业员の中で1人1枚の磁気カードを出すことを要求して、カードの上でロックを解除する磁気ストライプがあって、安全を确保するために、必ずN人がいっしょにいなければロックを开けることができなくて、Mを入力して、N 磁気ストライプの最小の方案を求めます.次のようになります.
サンプル入力:
5 3
サンプル出力:
0111000111 0011111010 1001011101 1100101011 1110110100
1はその場所を解くことができる磁気ストライプを表し、0は解くことができないことを表す.
今晩は疲れたので説明しないで、今度注釈をつけます.直接コード:
サンプル入力:
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;
}
}