电子数字 网易游戏在线笔试 第一题 hihocoder
题目链接 http://hihocoder.com/contest/ntest2016spring1/problem/1
这个题目有几个算法考点:
(1)对于一个LED数码管(由7个发光二极管封装在一起,对应的二极管编号见所给链接),给你一串整数,每个数字表示对应的二极管亮,其他二极管明暗未知,由该串数据求出该数码管能表示出什么数字。
思路:就是将1~7数字(表示对应的二极管亮)映射到数组(vector<int>),表示哪些数字是需要该二极管灯亮。
map<int, vector<int>*> dic;
vector<int> v1 = { 2,3,5,6,7,8,9,0};//意思就是2,3,5,6,7,8,9这几个数字需要1号二极管亮!
vector<int> v2 = {4,5,6,8,9,0 };
vector<int> v3 = { 1,2,3,4,7,8,9,0 };
vector<int> v4 = {2,3,4,5,6,8,9};
vector<int> v5 = { 2,6,8,0 };
vector<int> v6 = { 1, 3, 4, 5, 6, 7,8,9,0 };
vector<int> v7 = { 2, 3, 5, 6, 8, 9, 0 };
dic[1] = &v1;
dic[2] = &v2;
dic[3] = &v3;
dic[4] = &v4;
dic[5] = &v5;
dic[6] = &v6;
dic[7] = &v7;
然后,利用哈希表map<int,int>来统计输入的数据串究竟能够表示出什么数字,需要求各个发光二极管所能表示的数字取交集,得到的就是该串LED数码管还能表示的数字。
(2)求给定一个正数N,和K个LED数码管,其中每个数码管可以表示出的数字是有限的,用vector<set<int>>存储,vector[0]这个数字集合就是第一个LED数码管所能表示的数字,并且第一个数码管对应最高位,整数N前面可以补零。求出数码管所能表示出的所有比N小的组合形式个数!(这个是题目的要求,将条件改为求所有小于等于N的组合形式个数,是不是要更复杂?自己将这个问题单独罗列出来,放到最下面去,构成问题3,同时自己将利用递归来实现这个函数)
下面是源代码(能通过题目已经给出的那个测试用例,其他还未知):
#include<iostream>
#include<vector>
#include<string.h>
#include<algorithm>
#include<map>
#include<set>
using namespace std;
int main()
{ map<int, vector<int>*> dic;
vector<int> v1 = { ,,,,,,,};
vector<int> v2 = {,,,,, };
vector<int> v3 = { ,,,,,,, };
vector<int> v4 = {,,,,,,};
vector<int> v5 = { ,,, };
vector<int> v6 = { , , , , , ,,, };
vector<int> v7 = { , , , , , , };
dic[] = &v1;
dic[] = &v2;
dic[] = &v3;
dic[] = &v4;
dic[] = &v5;
dic[] = &v6;
dic[] = &v7; int len;//测试点个数
while (cin >> len && len != ){
//cin >> len;
for (int i = ; i < len; i++){
int K, N;
cin >> K >> N;
vector<set<int>> back(K,set<int>());
for (int j = ; j < K; j++){//处理K行数据
char str[];
vector<int> data;
cin.get();
cin.getline(str, , '\n');
for (int i = ; i < strlen(str); i++)//提取一行中的整数,保存到data当中,可以对其排序
{
if (str[i] != ' '){
int num = str[i] - '';
data.push_back(num);
}
}
sort(data.begin(), data.end());
map<int, int> inter;
for (int s1 = ; s1 < ; s1++){
inter[s1] = ;
}
inter[] = ;
for (int k = ; k < data.size(); k++){//将该二极管对应的备选数字添加到back中去,已经自动去重
vector<int>* ptr = dic[data[k]];
for (auto it = (*ptr).begin(); it != (*ptr).end(); it++){
inter[*it]++;
}
}
for (int s1 = ; s1 < ; s1++){
if (inter[s1] >= data.size())
back[j].insert(s1);
}
}//已经得到一个测试点的备选数字
vector<int> div;
for (int count = ; count < K; count++){
int temp = N % ;
div.push_back(temp);//div最前面是个位数字,back最前面是最左边的二极管对应最高位数字
N=N/;
}
int count = ;
for (int tag = ; tag < K; tag++){
auto it = back[tag];
int num = div[K - tag - ];
int count2 = ;
for (auto it2 = it.begin(); it2 != it.end(); it2++){
if (*it2 < num){
int sum = ;
for (int s1 = tag + ; s1 < K; s1++)
sum *= back[tag].size();
count += sum;
}
}
}
cout <<"结果:"<<count << endl;
}
}
return ;
}
(3)问题3
假定给自己一个数N,已经将其从最高位到最低位存储到了vector<int>val中(val[0]就是最高位),同时用vector<vector<int>>nums,来表示各个LED数码管能够表示的数字,求出所有LED数码管能表示出的小于等于N的数的总数量。函数接口 void helper(vector<vector<int>>& nums,vector<int>& val,int pos,int &count),
代码实现如下:
#include<iostream>
#include<string>
#include<vector>
using namespace std;
void helper(vector<vector<int>>& nums, vector<int>& val,int pos,int& count){
for (auto it = nums[pos].begin(); it != nums[pos].end();it++){
if (*it < val[pos]){
int count1 = ;
for (int i = pos + ; i < nums.size(); i++){
count1 = count1*nums[i].size();
}
count += count1;
}
else if (*it == val[pos]){
helper(nums, val, pos + , count);
}
}
}
int main()
{
vector<int> val = {,,};
vector<vector<int>> nums = { { , }, { , }, { , } };
int count = ;
int pos = ;
helper(nums, val, pos, count);
cout << "count=" << count << endl;
return ;
}
电子数字 网易游戏在线笔试 第一题 hihocoder的更多相关文章
- 今日头条 2018 AI Camp 5 月 26 日在线笔试编程题第一道——最佳路径
题目 给定一个 n*m 的矩阵 A ,矩阵中每一个元素为一个十六进制数.寻找一条从左上角都右下角的路径,每次只能向右或者向下移动, 使得路径上所有数字之积在 16 进制下的后缀 0 最少. 输入描述: ...
- 今日头条 2018 AI Camp 6 月 2 日在线笔试编程题第一道——最大连续区间和扩展
题目 给出一个长度为 n 的数组a1.a2.....ana1.a2.....an,请找出在所有连续区间 中,区间和最大同时这个区间 0 的个数小于等于 3 个,输出这个区间和. 输入描述: 第一行一个 ...
- unity,C#,游戏面试笔试真题
最开始的两家公司笔试面试题目 一家公司是学校聘请研究教育方面VR课件的公司,面试没几天,就收到了面试通过的消息,后面因为通过了另一家游戏公司而拒绝了. 另一家公司是一家游戏外企,在春熙路,当时笔试还可 ...
- 今日头条 2018 AI Camp 6 月 2 日在线笔试编程题第二道——两数差的和
题目 给 n 个实数 a_1, a_2 ... a_n, 要求计算这 n 个数两两之间差的绝对值下取整后的和是多少. 输入描述 第一行为一个正整数 n 和一个整数 m.接下来 n 行,第 i 行代表一 ...
- 18年今日头条笔试第一题题解:球迷(fans)
其实本题是加强版,原数据是100*100的,老师为了尊重我们的智商加成了3000*3000并进行了字符串处理…… 上原题~ 球迷 [问题描述] 一个球场C的球迷看台可容纳M*N个球迷.官方想统计一共有 ...
- 今日头条 2018 AI Camp 5 月 26 日在线笔试编程题第二道——最小分割分数
题目: 给 n 个正整数 a_1,…,a_n, 将 n 个数顺序排成一列后分割成 m 段,每一段的分数被记为这段内所有数的和,该次分割的分数被记为 m 段分数的最大值.问所有分割方案中分割分数的最小值 ...
- 金山网络2014春季Android实习生招聘-成都站-笔试第一题
实现单例模式,并实现方法int getResult(float a),将a*8后返回. package jinshanwangluo.exam; /** * @author guoxm * @date ...
- Legendary Items-微软实习生笔试第一题
题目如下: 这道题难点不仅在于正确理解题意,判断递归条件,更在于用数学方法推出解决公式.因为N最大为1百万,而内存只有256MB, 所以暴力递归肯定会超时,超空间. 不过,我才疏学浅,又没有大量时间去 ...
- 【面试笔试算法】Program 2:Amusing Digits(网易游戏笔试题)
时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 网易成立于1997年6月,是中国领先的互联网技术公司.其相继推出了门户网站.在线游戏.电子邮箱.在线教育.电子商务等多种服 ...
随机推荐
- DIOCP之编写第一个应用程序(三)
Client 设计功能如下: 1.建立与服务器连接 2.请求连接时,加密密码,采用Base64编码 3.定时发送心跳告诉服务器在线(长连接,用于接收推送信息) 4.进行相关的数据处理与交互 第一步:创 ...
- 介绍开源的.net通信框架NetworkComms框架之四 消息边界
原文网址: http://www.cnblogs.com/csdev Networkcomms 是一款C# 语言编写的TCP/UDP通信框架 作者是英国人 以前是收费的 目前作者已经开源 许可是 ...
- PTA Insert or Merge
According to Wikipedia: Insertion sort iterates, consuming one input element each repetition, and gr ...
- [OC笔记] protocol之我的见解
OC中的protocol就是和JAVA中interface差不多的东西,但是又不是完全一样的.这个protocol常用来实现委托,也就是自己不实现,当事件产生的时候去回调委托者. 让委托者去执行响应的 ...
- easyui 中datagrid 点击行的事件
$('#datagrid 的ID').datagrid({ onClickRow:function(index,data) { ...
- 学习 OPenGL
今天在网上看到一篇硕士论文<基于OpenGL三维虚拟场景建模技术研究_王志杰>,学习到OpenGL可以进行三维重建,决定从现在开始学习OpenGL,特开此贴.
- hashchange事件的认识
写过路由的同学都知道其原理是通过URL的改变,由导航信息来决定页面信息...表述的好像有点不准确 这么说吧,只要URL参数列表只要变化就会调用hashchange事件,此时event对象包括oldUR ...
- Java 内存区域和GC机制分析
目录 Java垃圾回收概况 Java内存区域 Java对象的访问方式 Java内存分配机制 Java GC机制 垃圾收集器 Java垃圾回收概况 Java GC(Garbage Collection, ...
- 乌邦图ubuntu配置iptables的NAT上网
cat /etc/network/iptables.up.rules # Generated by iptables-save v1. :: *nat :PREROUTING ACCEPT [:] : ...
- mysql修改为utf8格式
1.修改相应数据库的编码格式: -- 修改数据库编码为utf8 ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_general_ ...