合理分配 “锁”资源
问题描述:某部门要安装电子锁,要求在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;
}
}
浙公网安备 33010602011771号