合理分配 “锁”资源

来源:互联网 发布:山东大学网络继续教育 编辑:程序博客网 时间:2024/06/10 15:09

问题描述:某部门要安装电子锁,要求在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;}}


2 0