万卷网> 电子学会考级 >C/C++等级考试 > 2024年12月电子学会青少年软件编程(C/C++五级)等级考试试卷

2024年12月电子学会青少年软件编程(C/C++五级)等级考试试卷
操作/编程 五级 2024 2025-08-11 12:05:13 42

一、编程题

1.

赛场安排

比赛使用 OMS 监考系统,需要将参赛队员安排到系统中的虚拟赛场里,并为每个赛场分配一位监考老师。每位监考老师需要联系自己赛场内队员对应的教练们,以便发放比赛账号。为了尽可能减少教练和监考的沟通负担,我们要求赛场的安排满足以下条件:

- 每位监考老师负责的赛场里,队员人数不得超过赛场规定容量 C;

- 每位教练需要联系的监考人数尽可能少 —— 这里假设每所参赛学校只有一位负责联系的教练,且每个赛场的监考老师都不相同,为此我们设计了多轮次排座算法,按照尚未安排赛场的队员人数从大到小的顺序,每一轮对当前未安排的人数最多的学校进行处理。记当前待处理的学校未安排人数为 n;

- 如果 n ≥ C,则将其中 C 人安排到当前为空的编号最小的赛场,剩下的人继续按人数规模排队,等待下一轮处理;

- 如果 n < C,则寻找剩余空位数大于等于 n 的编号最小的赛场,将队员安排进去;

- 如果 n < C,且找不到任何非空的、剩余空位数大于等于 n 的赛场了,则新开一个赛场,将队员安排进去。

由于近年来参赛人数快速增长,2023年超过了 410 所学校 1.6 万人,所以我们必须写个程序来处理赛场安排问题。

时间限制:6000,内存限制:65536

输入

输入第一行给出两个正整数 N 和 C,分别为参赛学校数量和每个赛场的规定容量,其中 0 < N ≤ 5000,10 ≤ C ≤ 50。

随后 N 行,每行给出一个学校的缩写(为长度不超过 6 的非空小写英文字母串)和该校参赛人数(不超过 500 的正整数),其间以空格分隔。题目保证每所学校只有一条记录。

输出

按照输入的顺序,对每一所参赛高校,在一行中输出学校缩写和该校需要联系的监考人数,其间以 1 空格分隔。 最后在一行中输出系统中应该开设多少个赛场。

样例输入

10 30
zju 30
hdu 93
pku 39
hbu 42
sjtu 21
abdu 10
xjtu 36
nnu 15
hnu 168
hsnu 20

样例输出

zju 1
hdu 4
pku 2
hbu 2
sjtu 1
abdu 1
xjtu 2
nnu 1
hnu 6
hsnu 1
16
2.

化学反应式

“化学反应式”是用元素符号表示化学反应的一种等式,等式左边给出参与反应的元素,右边给出反应的结果。例如 CH4+2O2= CO2+ 2H2O 的意思是,参与反应的元素是甲烷和氧气,即 CH4和 O2,反应结果产生二氧化碳和水,即 CO2和 H2O。

现给定一些反应元素和结果,请你编写程序推出我们怎样才能得到这些结果。注意每种反应元素只能被用一次。为简单起见,我们将等式右边的所有元素都当成是一个结果。

时间限制:6000,内存限制:65536

输入

每个输入包含一个测试用例。每个测试用例先给出一个整数 N(2 ≤ N ≤ 20),随后给出 N 个不同的反应元素的编号。

第二行给出一个整数 M(1 ≤ M ≤ 10),随后给出 M 个不同的结果编号。所有编号都是一个 2 位数字。

 随后给出正整数 K(≤ 50),接下来 K 行,每行给出一个化学反应式,格式为: reactant_1 + reactant_2 + ... + reactant_n -> product 其中所有的反应元素(reactant)编号都是不同的,并且按升序排列。 

 注意:题目保证以下规则 

 (1)一套反应元素不会产生多个不同的结果,即诸如 01 + 02 -> 03 且 01 + 02 -> 04 这种情况保证不会出现; 

 (2)一个反应元素不会同时还是等式右边的结果元素,除非等式左边只有这一个元素。例如 01 -> 01 总是成立的(无论这个等式是否给出),但 01 + 02 -> 01 是不可能的; 

 (3)对于列出的等式中的每个结果,得到它的反应方法不会超过 5 种。

输出

输出用给定的反应元素产生所有给定结果的化学反应式。注意每种反应元素只能被用一次。 每个反应式占一行,格式与输入格式相同。顺序必须与输入中的结果编号顺序一致。

对顺序产生的每个结果,如果反应方法不唯一,输出反应元素的最小序列 —— 序列 { a1, … , am} 比 { b1, … , bn} 小的意思是:存在 1 ≤ i ≤ min(m, n) 使得 aj= bj对所有 j < i 成立,且有 ai< bi。 题目保证至少存在一个解。

样例输入

8 09 05 03 04 02 01 16 10
3 08 03 04
6
03 + 09 -> 08
02 + 08 -> 04
02 + 04 -> 03
01 + 05 -> 03
01 + 09 + 16 -> 03
02 + 03 + 05 -> 08

样例输出

02 + 03 + 05 -> 08
01 + 09 + 16 -> 03
04 -> 04
3.

买还是不买

小红想用自己喜欢的彩色珠子做一条珠串,于是去一家小店买珠子。店里有很多条彩色的珠串,但店主只卖整串,不拆散零售珠子。于是小红为了得到自己喜欢颜色的珠子,就得买很多条现成的珠串,回家拆了自己拼。

由于店里有上百条珠串,小红只好求助于你,请你写个程序,帮她看看是否有可能买到所有她喜欢颜色的珠子,并且使得多余的珠子尽可能少。

为简单起见,我们用数字 0 到 9、以及英文的 26 个字母的大小写来表示珠子的颜色(即珠子最多有 62 种颜色)。

在样例 1 中,买第 2 条和最后两条珠串是最划算的,因为这样只有 3 颗珠子是多余的。

在样例 2 中,把全部三条珠串都买下也不行,因为还少三颗 R 珠。

时间限制:9000,内存限制:65536

输入

输入第一行给出小红想要的珠串。下一行给出正整数 N(≤ 100),随后 N 行,每行给出店里的一条珠串。所有珠串中的珠子不超过 1000 颗。

输出

如果能凑出小红想要的珠串,则在一行中输出 Yes、空格、最少的多余珠子的个数;否则输出 No、空格、凑不出来的珠子的个数。

样例输入1

RYg5
8
gY5Ybf
8R5
12346789
gRg8h
5Y37
pRgYgbR52
8Y
8g

样例输出1

Yes 3

样例输入2

YrRR8RRrY
3
ppRGrrYB225
8ppGrrB25
Zd6KrY

样例输出2

No 3
4.

小白兔拔萝卜

小白兔拔萝卜,但是它的力量有限,太大的萝卜它拔不动。于是它叫来了一群小伙伴……

本题就请你根据小白兔们的力量和拔出这个萝卜需要的力量,告诉小白兔,它最少需要哪些伙伴能拔出这只大萝卜。

时间限制:7000,内存限制:65536

输入描述

输入在第一行里给出两个不超过 1000 的正整数 n 和 T,分别是小白兔的数量和拔出这个萝卜需要的力量。

随后一行给出 n 个不超过 100 的正整数,其中第 i 个数对应编号为 i 的小白兔的力量(i=1, … , n)。

输出描述

如果兔子们有可能拔成功,则首先在第一行输出最少需要多少只兔子才能拔出这只萝卜,然后第二行从小到大输出参与拔萝卜的兔子们的编号。编号间以 1 个空格分隔,行首尾不得有多余空格。 

如果所有兔子合力都不能拔出萝卜,则首先在第一行输出 0,随后在第二行中输出:Suan4 le ba, hai2 cha4 X. 其中 X 是小白兔们缺少的力量值。

注意:力量等于 T 是可以拔出萝卜的。 解可能不是唯一的,你只要随便输出一组就可以。

样例输入1

10 100
3 25 4 91 13 81 64 38 49 51

样例输出1

2
2 4

样例输入2

5 50
3 2 8 5 10

样例输出2

0
Suan4 le ba, hai2 cha4 22.
公众号
客服 反馈
顶部