image

编辑人: 桃花下浅酌

calendar2025-07-25

message2

visits31

2024年12月C语言二级答案及解析

一、简答题

1、1.逆行
网上有个段子说:妻子在家听广播,听到某高速路上有一辆车在逆行,想到丈夫在那条高速上行驶,就打电话对丈夫说:“老公啊,你走的那条高速上有一辆车在逆行,你小心点。”她丈夫说:“何止啊!我看好几百辆车都在逆行!”
现在我们查了一下高速公路上拍到的好几百辆车的时速,发现有的朝东开,有的朝西开,都不知道是谁在逆行了…… 于是让我们简单粗暴地解决这个问题:朝哪个方向开的车多,哪个方向就是正确的,另一方就判为逆行(开玩笑的千万嫑当真)。现在就请你统计一下,有多少辆车是逆行的。
时间限制:1000
内存限制:65536
输入
输入第一行给出一个正整数 N,为高速公路上拍到的车辆数,题目保证这是一个不超过 1000 的奇数。第二行给出 N 个整数,为每辆车的时速。我们用正数表示朝东开的时速,负数表示朝西开的时速。题目保证时速(绝对值)均不超过 200,并且时速没有 0,即没有一辆车是停在高速公路上不动的。
输出
在一行中输出逆行的车辆数。
样例输入
7
85 -90 110 95 112 -120 -70
样例输出
3

2、2.为 i 做 e
“为 i 做 e”是最近新出的流行梗。这里的 i 和 e 指 MBTI 人格测试中的不同性格,i 是社恐,e 是外向。“为 i 做 e”就是在一群内向的人中促使自己变成外向(奇奇怪怪无用的知识又增加了)。
给定某次大型活动中的餐桌安排,请你判断一下哪几桌的客人需要“为 i 做 e”了。
时间限制:6000
内存限制:65536
输入
输入第一行首先给出正整数 n(≤ 105),随后 n 行,每行给出一个人的代号和其性格,其中代号由 8 位数字组成,性格是单个字母 i 或 e,其间以空格分隔。 接下来是餐桌安排。首先给出正整数 m(≤ 103),为餐桌数量,随后 m 行,每行给出一个正整数 k(≤ 10)以及该桌 k 位客人的代号,用空格分隔。第 i 行对应的是第 i 桌的信息(1 ≤ i ≤ m)。题目保证没有人在餐桌安排中重复出现,且餐桌上每个人的性格都已给出。
输出
如果一桌客人全是 i 人,则意味着有人要“为 i 做 e”了。请在一行中按递增序输出这些桌的桌号。数字间以 1 个空格分隔,行首尾不得有多余空格。如果这样的餐桌不存在,则在一行中输出 None。
样例输入
样例1:
10
00000000 i
12345678 e
23468270 i
78827341 e
67476289 i
35748108 e
99999999 i
40926483 i
88472901 i
55032849 i
3
3 00000000 67476289 99999999
4 12345678 78827341 35748108 55032849
3 23468270 40926483 88472901
样例2:
10
00000000 i
12345678 e
23468270 i
78827341 e
67476289 i
35748108 e
99999999 i
40926483 i
88472901 i
55032849 i
2
4 78827341 35748108 55032849 00000000
6 12345678 67476289 99999999 23468270 40926483 88472901
样例输出
样例1:
1 3
样例2:
None

解析:

根据题目描述,我们需要判断哪些餐桌的客人全是内向的人(即全是性格为 i 的客人),然后输出这些餐桌的桌号。如果这样的餐桌不存在,则输出 None。

具体实现时,我们可以使用Python编程语言。首先读取输入,包括总人数 n、每个人的代号和性格,以及餐桌的安排。然后遍历每桌客人,对于每桌,统计性格为 i 的客人的数量。如果某桌全是内向的人,即性格为 i 的客人数量等于该桌的人数,将桌号添加到结果集合中。最后,将结果集合中的桌号按递增序输出。

以下是Python代码实现:

def find_tables_needing_adjustment():
    n = int(input())  # 读取总人数
    people = []  # 存储每个人的代号和性格
    for _ in range(n):
        code, personality = input().split()  # 读取每个人的代号和性格
        people.append((code, personality))  # 存储为元组
    
    m = int(input())  # 读取餐桌数量
    tables = []  # 存储餐桌信息
    for _ in range(m):
        k = int(input())  # 读取每桌的人数
        codes = input().split()  # 读取每桌客人的代号
        table = (k, codes)  # 存储为元组,包含人数和代号列表
        tables.append(table)  # 将餐桌信息添加到列表中
    
    tables_needing_adjustment = set()  # 存储需要"为 i 做 e"的餐桌号
    for table in tables:
        all_introverts = True  # 假设桌上都是内向的人
        for code in table[1]:  # 遍历桌上的每个客人的代号
            if code not in people or people[code][1] != 'i':  # 如果客人不是内向的或不存在于输入中
                all_introverts = False  # 说明桌上不是全是内向的人
                break  # 退出循环检查下一桌
        if all_introverts:  # 如果桌上全是内向的人
            tables_needing_adjustment.add(table[0])  # 将桌号添加到需要调整的餐桌集合中
    
    if tables_needing_adjustment:  # 如果存在需要调整的餐桌
        print(*sorted(tables_needing_adjustment))  # 输出按递增序的桌号,数字间以空格分隔
    else:  # 如果不存在这样的餐桌
        print("None")  # 输出 None

3、3.吃火锅
本题要求你实现一个程序,自动检查你朋友给你发来的信息里有没有 `chi1 huo3 guo1`。
时间限制:1000
内存限制:65536
输入
输入每行给出一句不超过 80 个字符的、以回车结尾的朋友信息,信息为非空字符串,仅包括字母、数字、空格、可见的半角标点符号。当读到某一行只有一个英文句点 . 时,输入结束,此行不算在朋友信息里。
输出
首先在一行中输出朋友信息的总条数。然后对朋友的每一行信息,检查其中是否包含 chi1 huo3 guo1,并且统计这样厉害的信息有多少条。在第二行中首先输出第一次出现 chi1 huo3 guo1 的信息是第几条(从 1 开始计数),然后输出这类信息的总条数,其间以一个空格分隔。题目保证输出的所有数字不超过 100。 如果朋友从头到尾都没提 chi1 huo3 guo1 这个关键词,则在第二行输出一个表情 `-_-#`。
样例输入
样例1:
Hello!
are you there?
wantta chi1 huo3 guo1?
that's so li hai le
our story begins from chi1 huo3 guo1 le
.

样例2:
Hello!
are you there?
wantta qi huo3 guo1 chi1huo3guo1?
that's so li hai le
our story begins from ci1 huo4 guo2 le
.
样例输出
样例1:
5
3 2
样例2:
5
-_-#

解析:

程序首先初始化几个变量来记录信息条数、包含关键词的条数和当前处理的信息条数。然后进入一个循环,不断读取朋友信息,直到遇到结束标志".“。对于每一行信息,程序检查是否包含关键词"chi1 huo3 guo1”,并更新相应的计数变量。如果找到关键词,程序还会特别处理第一条包含关键词的信息,输出其条数。最后,程序输出总条数和包含关键词的条数(或表情符号"-_-#")。

4、4.就不告诉你
做作业的时候,邻座的小盆友问你:“五乘以七等于多少?”你应该不失礼貌地微笑着告诉他:“五十三。”本题就要求你,对任何一对给定的正整数,倒着输出它们的乘积。
时间限制:1000
内存限制:65536
输入
输入在第一行给出两个不超过 1000 的正整数 A 和 B,其间以空格分隔。
输出
在一行中倒着输出 A 和 B 的乘积。
样例输入
5 7
样例输出
53

解析:

题目要求输入两个正整数A和B,并输出它们的乘积的倒数形式。例如,如果输入是5和7,则输出应该是53,即7乘以5的倒数形式。

解题步骤如下:

  1. 读取用户输入的两个正整数A和B。
  2. 计算A和B的乘积。
  3. 将乘积转换为字符串形式。
  4. 使用字符串切片操作将字符串反转。
  5. 输出反转后的字符串。

以下是Python代码实现:

A, B = map(int, input().split())  # 读取用户输入的两个整数
product = A * B  # 计算乘积
reversed_product = str(product)[::-1]  # 将乘积转换为字符串并反转
print(reversed_product)  # 输出反转后的字符串

这样,无论输入什么样的正整数对,程序都会正确地倒序输出它们的乘积。

5、5.排课
排课是个世界难题。
假设每个学期有 N 个教学班的课需要排,每周有 M 个时间段可以上课,全校共有 K 间教室,不同排课组合方案的个数可能会超过整个宇宙的质子数。更为复杂的是,每个学期排课前,学校还会收集每个教学班任课老师不能上课的时间段,还要保证排课不与老师的时间安排起冲突。
当然,本题不是要求你实现一个排课算法,而是要求你实现一个排课方案检查算法。即给定每个教学班上课的时间和地点,你需要检查这个时间段和地点是否只有这一个班上课,并且这个上课时间不会正好是任课老师不能上课的时间。
时间限制:5000
内存限制:65536
输入
输入在第一行中给出三个正整数:N(≤ 104)为教学班总数;M(≤ 40)为一周内上课时间段的个数;K(≤ 103)为教室总数。数字间以空格分隔。以下我们就将教学班、时间段、教室分别从 1 开始顺序编号。 随后 N 行,每行给出一个教学班的任课教师时间限制和排课的信息。格式如下: L T[1] ... T[L] Time Room 其中 L 是任课教师的时间限制数量(< M),后面给出 L 个该老师不能上课的时间段编号;Time 是该教学班安排的上课时间段编号,Room 是上课教室编号。
输出
如果给定的课表安排是完全无冲突的,则在一行内输出:Perfect Arrangement for N classes! 其中 N 是教学班数量。 如果课表有冲突,则需要输出冲突原因。我们首先假设教学班是按照编号递增序进行排课的,教学资源先到先得。如果后面安排的教学班 A 跟前面的教学班 B 排在了同一个时间和地点,则在一行中输出 ERROR: Conflict between A and B.;如果教学班 A 的上课时间跟任课教师有冲突,则在一行中输出 ERROR: Conflict with instructor for A.。当两种冲突都发生时,分两行输出,先输出教学班冲突的信息。发生冲突的教学班暂不安排。
样例输入
样例1:
5 20 10
2 1 5 10 7
0 10 3
5 2 4 6 8 10 3 3
3 10 3 18 15 1
1 20 19 10
样例2:
5 20 10
2 1 5 10 7
0 10 7
5 2 4 6 8 10 6 3
3 10 3 18 6 3
2 20 10 10 7
样例输出
样例1:
Perfect Arrangement for 5 classes!
样例2:
ERROR: Conflict between 2 and 1.
ERROR: Conflict with instructor for 3.
ERROR: Conflict between 5 and 1.
ERROR: Conflict with instructor for 5.

解析:

{针对这个问题,我们可以设计一个排课方案检查算法,主要步骤如下:

  1. 读取输入:首先读取输入数据,包括教学班总数N、一周内上课时间段的个数M、教室总数K,以及每个教学班的任课教师时间限制和排课信息。
  2. 初始化数据结构:创建一个数据结构(如数组或哈希表)来存储每个时间段和教室的排课情况。
  3. 检查时间段和地点的唯一性:遍历每个教学班,检查其安排的时间段和教室是否与其他教学班冲突。如果同一时间段和教室有多个教学班安排课程,则存在冲突。
  4. 检查教师时间限制:对于每个教学班,检查其安排的上课时间是否落在任课教师的时间限制内。如果冲突,则记录冲突信息。
  5. 输出结果:如果排课方案无冲突,输出"Perfect Arrangement for N classes!",其中N为教学班数量。如果存在冲突,根据冲突类型输出相应的错误信息。

在算法实现过程中,需要注意以下几点:

  • 需要按照教学班的顺序进行检查,确保先安排的教学班不会与后面的教学班发生冲突。
  • 可以使用数据结构(如数组或哈希表)来高效地查找时间段和教室的排课情况,以减少搜索时间。
  • 在检查教师时间限制时,需要将教学班的上课时间段与教师的不能上课时间段进行比较,确保没有冲突。

根据题目要求,我们只需要实现排课方案检查算法,而不需要实现具体的排课算法。因此,重点在于设计和实现一个有效的检查机制,以确保排课方案的正确性和无冲突性。}

喵呜刷题:让学习像火箭一样快速,快来微信扫码,体验免费刷题服务,开启你的学习加速器!

创作类型:
原创

本文链接:2024年12月C语言二级答案及解析

版权声明:本站点所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明文章出处。
分享文章
share