笔试—文远知行嵌入式软件笔试
题型:3道编程题
题目1:
题目描述
东东非常喜欢玩骰子,
有一次东东观察地上的骰子,发现正常的骰子我们无论从哪个角度看去最多只能看到3个面,也就是6个面的一半
他发现如果把骰子想象成这个正方体,展开之后的六个面是这样的:
|
6 |
|
4 |
1 |
5 |
|
2 |
|
|
3 |
|
但也有展开不一样的骰子,如下
|
6 |
|
4 |
2 |
5 |
|
1 |
|
|
3 |
|
于是东东把这六个面抽象成6个字母abcdef
|
a |
|
b |
c |
d |
|
e |
|
|
f |
|
于是a的对面是e,b的对面是d,c的对面是f
东东想知道,把相邻(共用一个顶点)的三个面的骰子的数字加起来。能够得到多少种结果?分别是什么?
输入描述:
六个用单个空格分隔的数字,分别代表a,b,c,d,e,f输入中所有数字不大于1000且均为正整数
输出描述:
第一行一个数字n,表示输出结果的数量
第二行n个数字A1,A2 .....n,表示所有的结果,从小到大排序,用单个空格分隔,结尾没有空格
输入样例1:
6 4 1 5 2 3
输出:
8
7 8 9 10 11 12 13 14
说明:
6+4+1=11
6+1+5=12
4+1+2=7
输入样例2:
1 1 1 1 1 1
输出
1
3
说明
不论从哪个视角选择三个连续的面,最终的结果都是1+1+1=3
#include <iostream>
#include <vector>
#include <set>
#include <numeric>
int main() {
// 读入 a,b,c,d,e,f 六个面的数字
int a, b, c, d, e, f;
std::cin >> a >> b >> c >> d >> e >> f;
// std::set 会自动处理重复并排序
std::set<int> unique_sums;
// 计算8个顶点的三面之和并插入set
// 4个与顶面'a'相邻的顶点
unique_sums.insert(a + b + c);
unique_sums.insert(a + c + d);
unique_sums.insert(a + b + f);
unique_sums.insert(a + d + f);
// 4个与底面'e'相邻的顶点
unique_sums.insert(e + b + c);
unique_sums.insert(e + c + d);
unique_sums.insert(e + b + f);
unique_sums.insert(e + d + f);
// 输出结果数量
std::cout << unique_sums.size() << std::endl;
// 遍历set并输出所有结果
bool is_first = true;
for (int sum : unique_sums) {
if (!is_first) {
std::cout << " ";
}
std::cout << sum;
is_first = false;
}
std::cout << std::endl;
return 0;
}
解决这个问题的关键是首先理解骰子展开图与实际立方体面的对应关系,然后找出所有共用一个顶点的三面组合。
解题思路
- 分析骰子结构:我们可以将其想象成一个立方体,通常,可以把 c 面看作正面。a 折叠起来成为顶面。e 折叠起来成为底面。b 成为左面。d 成为右面。f 成为背面。根据这个结构,我们可以确定相对的面是:顶(a) 与 底(e)、左(b) 与 右(d)、前(c) 与 后(f)
- 找出所有顶点:一个立方体有8个顶点,每个顶点都是由三个面交汇而成。我们可以根据上面的对应关系,列出这8个顶点分别是由哪三个面组成的:顶点1 (顶-前-左): a, c, b、顶点2 (顶-前-右): a, c, d、顶点3 (顶-后-左): a, f, b、顶点4 (顶-后-右): a, f, d、顶点5 (底-前-左): e, c, b、顶点6 (底-前-右): e, c, d、顶点7 (底-后-左): e, f, b、顶点8 (底-后-右): e, f, d
- 计算并存储结果:计算出上述8个组合的数字之和。为了处理重复的结果并自动排序,我们可以使用 C++ 中的 std::set 数据结构。将计算出的8个和全部插入 set 中,set 会自动去除重复项并保持元素从小到大排序。最后,输出 set 的大小和其中的所有元素。
题目2:
题目描述
柠柠和两位好朋友即将参加一场AUPC程序设计比赛,热身赛时,他们在考虑正式比赛使用电脑的数量。
他们可以选择使用一台电脑或者三台电脑,已经提前得知题目有N道,一场比赛有T分钟。
三个人使用一台电脑解开这些题目的时间分别是a1,a2,a3,.....an,
三个人使用三台电脑解开这些题目的时间分别是b1,b2,b3,......bn ,
一旦比赛开始之后,使用的电脑数量不能更改,不论是使用几台电脑,同一时刻他们只能同时求解一道题目,但是他们可以任意选择做题顺序,如果解出某个题目后当前时间超过T分钟,则该题目不算解出。
他们想知道,他们最多能解出多少题目,并且携带几台电脑比较合适(哪种方案解出的题目数量最多,如果一样多,输出携带电脑数量较少的那一种)。
输入描述:
第一行为两个空格分隔的整数N(N<-20)和T(T<-4320),代表题目的数量和比赛的时长
第二行为N个空格分隔的整数a1,a2,a3,…an ,第三行为N个空格分隔的整数b1,b2,b3....bn其中1<=ai<=4320(1<=i<=n)
其中1<=bi<=4320(1<=i<=n)
输出描述:
第一行输出他们能最多解出的题目数量,第二行请输出携带几台电脑比较合适(用数字表示即可)
输入样例1:
5 10
1 2 3 4 5
5 9 3 2 1
输出
4
1
#include <iostream>
#include <vector>
#include <numeric>
#include <algorithm>
// 辅助函数,计算在给定总时长T和一组解题时间下,能解出的最大题目数
int calculateMaxSolved(int T, std::vector<int>& times) {
// 贪心策略:先解决耗时短的题目,所以先排序
std::sort(times.begin(), times.end());
int solved_count = 0;
long long time_spent = 0; // 使用 long long 防止累加时溢出
for (int time_needed : times) {
if (time_spent + time_needed <= T) {
time_spent += time_needed;
solved_count++;
} else {
// 时间不够了,无法再解下一题
break;
}
}
return solved_count;
}
int main() {
int N, T;
std::cin >> N >> T;
std::vector<int> times_one_computer(N);
std::vector<int> times_three_computers(N);
// 读取使用一台电脑的时间
for (int i = 0; i < N; ++i) {
std::cin >> times_one_computer[i];
}
// 读取使用三台电脑的时间
for (int i = 0; i < N; ++i) {
std::cin >> times_three_computers[i];
}
// 分别计算两种情况下的最大解题数
int solved_with_one = calculateMaxSolved(T, times_one_computer);
int solved_with_three = calculateMaxSolved(T, times_three_computers);
// 比较结果并输出
if (solved_with_three > solved_with_one) {
std::cout << solved_with_three << std::endl;
std::cout << 3 << std::endl;
} else {
// 包括 solved_with_one > solved_with_three
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
本专栏主要是介绍嵌入式软件开发岗位的相关知识和学习攻略,为大家提供一份笔试与面试手册。包括有嵌入式软件开发岗位介绍与学习攻略;校园招聘和offer疑惑问题的介绍;在笔试方面,如何刷题为笔试作准备,提供往年笔试真题;在面试方面,提供相关知识的复习重点,提供面试真题。包括有:华为、蔚来、文远、大疆、三一、深信服、亚马逊、Intel、百度、科大讯飞、OPPO、京东、中兴、比特大陆|算能、美团等等


查看1道真题和解析