本文共 4024 字,大约阅读时间需要 13 分钟。
时间限制:10000ms
单点时限:1000ms 内存限制:256MB描述
电子数字在生活中很常见,而许多的电子数字是由LED数码管制作而成。数字LED数码管一般由7个发光二极管封装在一起,组成’8’字型,引线在内部连接完成。如下图所示,我们可以对每个发光管进行编码从1到7。而数字0到数字9可以由这七根发光管的亮暗来表示。
对LED数码管的二极管进行编码
用LED数码管表示数字0-9
假设我们现在有从左到右排列好的K个LED数码管,并且我们已知每个数码管当前有哪些编号的二极管是亮着的,另外剩余的二极管由于某些原因,我们并不清楚它们的亮暗情况。由于已经有部分二极管是确定亮着的,所以每个LED数码管能表示的数字范围会有所缩小,譬如假设1号二极管已经确定是亮着的状态,那么这个LED数码管就不能表示数字1和4。
我们想知道的是,给定一个数N,在这K个LED数码管的当前亮暗的状态下,所有可能表示的数中,比N小的数有多少个。
注意,前导0是必须的,假设有4个数码管的话,’0000’表示0,’0123’表示123,即每个数的表示方法唯一。
输入
每个输入数据包含多个测试点。
第一行为测试点的个数 S ≤ 100。之后是 S 个测试点的数据。测试点之间无空行。
每个测试点的第一行为 K(1 ≤ K ≤ 5)和N(0 ≤ N ≤ 109)。之后是K行,每行表示对应数码管已点亮的二极管的情况。每行至少包含一个数字,表示对应点亮的二极管的编号,即每个数码管至少有一根二极管是点亮的。二极管编号的范围保证在1到7之间,且每行无重复编号。
注意表示数码管点亮情况的每行数字之间以及行首行末之间可能存在冗余空格,每行的字符总长度不超过100。
输出
对于每个测试点,对应的结果输出一行,表示这K个数码管在当前状态下,所有可能表示的数中,比N小的数有多少个。
样例解释
第一个样例中,只有’020’, ‘026’, ‘028’符合要求。
第三个样例中,只有’000’符合要求。
样例输入
3
3 50 3 1 1 4 5 1 5 6 7 4 100 1 2 3 4 5 6 7 1 1 7
样例输出
3
0 1
分析:这题是一道相对思路直观的题目,但是后面处理比 N 小的数,是可以转换为排列组合的数学问题解的。当然这样就需要判断是不是相等,如果相等就继续深入。
排列法:
#include#include #include using namespace std;int res[12][12];int digitCnt[6] ={ 0}; //该位可行计数int miniCnt[6] = { 0}; //该位比之小的int equalCnt[6] = { 0}; //是否和所比数当位有相等int manyDigit(int a) { int cnt = 1; while ( a/=10 ) { ++cnt; } return cnt;}//get特定位数int getDigit(int a, int n) { int p = pow(10,n-1); return (a/p)%10;}void work(int &resCnt,int deep,int n) { if(deep == n) { //递归结束条件 return; } if ( equalCnt[deep] ) { //如果可相等 work(resCnt,deep+1,n); int tmpCnt = miniCnt[deep]; for (int i=deep+1;i >T;start: while (T--) { //init for (int i=0;i<12;++i) { for (int j=0;j<12;++j) { res[i][j] = 1; } } memset(digitCnt,0,sizeof(digitCnt)); memset(miniCnt,0,sizeof(miniCnt)); memset(equalCnt,0,sizeof(equalCnt)); int K; cin>>K; int N; cin>>N; getchar(); for (int i=0;i
暴力:
#include#include using namespace std;void getNum(vector > numList, int deep, int temp, vector &totalNums);int main(void){ int deng[10][7] = { { 1,1,1,0,1,1,1},//0 { 0,0,1,0,0,1,0}, { 1,0,1,1,1,0,1}, { 1,0,1,1,0,1,1}, { 0,1,1,1,0,1,0}, { 1,1,0,1,0,1,1}, { 1,1,0,1,1,1,1}, { 1,0,1,0,0,1,0},//7 { 1,1,1,1,1,1,1}, { 1,1,1,1,0,1,1}//9 }; int S_test; //测试点的个数 int K_LED; //K个LED数码管 int compareNum; //给定每个测试点比较的数 cin>>S_test; int *endAnswer = new int[S_test]; //输出结果 for(int i=0;i >K_LED>>compareNum; //K个LED数码管, 测试的数字 cin.ignore(); //忽略上一行的换行符!!! vector >num_K_LED; //存储每个LED可能的数字 for (int j=0;j >eachLine; //每行 int servenLight[7] = { 0}; //单个LED的7个指示灯哪个亮 int idx = 0; //数组下标 for(int k=0;k
转载地址:http://iihwm.baihongyu.com/