网易互娱2017实习生招聘在线笔试第一场-1电子数字

http://hihocoder.com/contest/ntest2016spring1/problem/1

时间限制:10000ms 

单点时限:1000ms 

内存限制:256MB 
描述 
电子数字在生活中很常见,而许多的电子数字是由LED数码管制作而成。数字LED数码管一般由7个发光二极管封装在一起,组成’8’字型,引线在内部连接完成。如下图所示,我们可以对每个发光管进行编码从1到7。而数字0到数字9可以由这七根发光管的亮暗来表示。


假设我们现在有从左到右排列好的K个LED数码管,并且我们已知每个数码管当前有哪些编号的二极管是亮着的,另外剩余的二极管由于某些原因,我们并不清楚它们的亮暗情况。由于已经有部分二极管是确定亮着的,所以每个LED数码管能表示的数字范围会有所缩小,譬如假设1号二极管已经确定是亮着的状态,那么这个LED数码管就不能表示数字1和4。

我们想知道的是,给定一个数N,在这K个LED数码管的当前亮暗的状态下,所有可能表示的数中,比N小的数有多少个。

注意,前导0是必须的,假设有4个数码管的话,’0000’表示0,’0123’表示123,即每个数的表示方法唯一。

样例输入

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

乍一看还以为要数位dp,后发现其实只要直接暴力,思路比较直接的题目,只是读入时要稍微注意一下

#include<iostream>
#include<vector>
#include<string.h>
using namespace std;
typedef long long ll;
#define rep(i,n) for(int i=0;i<n;i++)
#define mst(k,j) memset(k,j,sizeof(k))
int kmap[8];
int pox[7]={1,10,100,1000,10000,100000,1000000};
int h,ans;
int res;
int k,n;
vector<int> vlist[6];

void init(){   //其实是先马上秒写了个小程序把几个二进制转换成了十进制
	kmap[1]=1005; // 1111101101
	kmap[2]=881;  // 1101110001
	kmap[3]=927;  // 1110011111
	kmap[4]=892;
	kmap[5]=325;
	kmap[6]=1019;
	kmap[7]=1005;
}

void dfs(int u){
	if(u==k){
		if(res<n)
			ans++;
		return;
	}
	rep(i,vlist[u].size()){
		res+=(vlist[u][i]*pox[k-u-1]);
		dfs(u+1);
		res-=(vlist[u][i]*pox[k-u-1]);
	}
}

int main()
{
	init();
	int T;
	cin>>T;
	char c;
	int has[6];
	while(T--){
		ans=0;
		cin>>k>>n;
		rep(i,6)
			vlist[i].clear();
		c=getchar();
		rep(i,k){
			while(c=='\n'||c==' '){
				c=getchar();
			}
			has[i]=kmap[c-'0'];
			c=getchar();
			while(c!='\n'){
				if(c>='0'&&c<='9')
					has[i]&=(kmap[c-'0']);
				c=getchar();
			}
			h=1;
			rep(j,10){
				if(h&has[i]){
					vlist[i].push_back(j);
				}
				h=h<<1;
			}
		}
		dfs(0);
		cout<<ans<<endl;
	}
}






猜你喜欢

转载自blog.csdn.net/hqw11/article/details/50933644
今日推荐