image

编辑人: 未来可期

calendar2025-06-13

message8

visits421

2023年NOC大赛_Python软件创意编程赛项_复赛_初中组真题(忽略分值)答案及解析

一、实操题

1、出租车费用

时间限制:1s

内存限制:128mb

(注:input()括号中不允许添加任何提示语)

根据乘坐出租车的里程,计算应该支付的费用。

出租车根据行驶里程阶梯式计价,具体规则如下表:

请补全下面程序,使程序实现如下功能:

(1)程序开始运行后,输入一个正整数,表示乘坐出租车的里程数;

(2)根据规则计算并输出乘坐出租车应该支付的费用,结果保留一位小数。

d = int(input())

if __________:

    cost = d * 2

__________

    cost = __________

else:

    cost = __________

print('%.1f' % cost)

参考答案:```pythond = int(input())if d <= 3:cost = d * 2elif d <= 10:cost = 6 + (d - 3) * 1.5else:cost = 14.5 + (d - 10) * 2print('%.1f' % cost)```

解析:【喵呜刷题小喵解析】:

根据题目要求,我们需要根据行驶的里程数来计算出租车费用。根据题目给出的规则,行驶里程数分为三个区间,每个区间有不同的计价方式。

首先,我们需要判断里程数d是否小于等于3,如果是,则费用为d * 2。

其次,如果里程数d大于3且小于等于10,则费用为6 + (d - 3) * 1.5,即基础费用6元加上超过3公里的部分每公里1.5元。

最后,如果里程数d大于10,则费用为14.5 + (d - 10) * 2,即基础费用14.5元加上超过10公里的部分每公里2元。

根据以上规则,我们可以补全程序,实现题目要求的功能。

2、和的结果数

时间限制:1s

内存限制:128mb

(注:input()括号中不允许添加任何提示语)

请补全下面程序,使程序实现如下功能:

(1)输入n(2≤n≤100)个整数,整数之间以空格隔开,并保证n个数各不相同;

(2)从这n个数中任选两个,计算并输出任意两个数的和共有多少种不同结果。

例如:

输入一组整数1 3 4 6,任意两数和可能为4(1+3)、5(1+4)、7(1+6 或 3+4)、9(3+6)、10(4+6),因此,输出结果应为5。

ls = [int(i) for i in input().split()]

results = []

for i in range(_______):

    for j in range(_______):

        s = ls[i] + ls[j]

        if s not in results:

            _____________


print(len(results))

参考答案:```pythonls = [int(i) for i in input().split()]results = set()for i in range(len(ls)):for j in range(i+1, len(ls)):s = ls[i] + ls[j]results.add(s)print(len(results))```

解析:【喵呜刷题小喵解析】:

首先,我们需要补全代码以实现题目的要求。题目中给出了一个不完整的代码段,需要补充完整以实现题目的功能。

在给出的代码中,我们首先需要读入n个整数,并且确保n个数各不相同。题目中已经给出读入的方式,所以这部分不需要修改。

然后,我们需要从n个数中任选两个,计算并输出任意两个数的和共有多少种不同结果。这部分的代码可以通过两层循环实现,外层循环遍历每个数,内层循环遍历从当前数之后的每个数,然后计算它们的和,并将结果添加到结果集中。

由于题目要求输出不同结果的数量,所以我们需要将结果集转化为集合类型,这样可以直接使用len函数计算集合中元素的数量。

最后,我们输出集合中元素的数量即可。

根据上述分析,我们补全代码,并使用集合类型来存储结果。注意在内层循环中,j应该从i+1开始遍历,这样可以避免重复计算相同的和。

3、因数和个数

时间限制:1s

内存限制:128mb

(注:input()括号中不允许添加任何提示语)

把一个数的因数全加在一起,叫做这个数的因数和。例如,6的因数有1、2、3、6,则它的因数和为1 + 2 + 3 + 6 = 12。

请编写一段程序,输入一个正整数n(n≤1000),判断因数和为n的正整数有多少个,并依次输出这些正整数。

输入描述:

输入一个正整数n(n≤1000)

输出描述:

第一行输出一个正整数,表示因数和为n的正整数的数量,如不存在,则输出0

如果存在,则第二行由小到大输出所有符合条件的数,数字之间以空格隔开


输入样例1:

12

输出样例1:

2
6 11

样例说明1:

因数和为12的正整数有2个,分别是6和11


输入样例2:

10

输出样例2:

0

样例说明2:

因数和为10的正整数不存在,所以仅输出0

参考答案:```pythonn = int(input())count = 0for i in range(1, n+1):s = 0for j in range(1, i+1):if i % j == 0:s += jif s == n:print(i, end=' ')count += 1print(count)```

解析:【喵呜刷题小喵解析】:

本题要求判断因数和为n的正整数有多少个,并依次输出这些正整数。我们可以使用暴力枚举的方法,遍历1到n之间的所有正整数,对于每个正整数,遍历其所有因数,计算其因数和,如果等于n,则输出该正整数,并计数。最后输出计数值即可。

具体实现时,我们可以使用两个嵌套的循环,外层循环遍历1到n之间的所有正整数,内层循环遍历该正整数的所有因数,计算因数和。如果因数和等于n,则输出该正整数,并计数。最后输出计数值即可。

注意,本题中输入样例中的n是用字符串形式输入的,我们需要使用int()函数将其转换为整数形式。另外,输出时需要使用print()函数,并且需要使用end参数指定输出时以空格隔开,否则输出的数字之间会有换行符。

时间复杂度为O(n^2),其中n为输入的正整数。由于n≤1000,因此时间复杂度可以接受。

4、单词变复数

时间限制:1s

内存限制:128mb

(注:input()括号中不允许添加任何提示语)

英语单词在变成复数形式时,有以下几种常见情况(不完全):

(1)常规情况下结尾直接加s;

(2)以s、sh、ch、x结尾的单词,加es;

(3)以辅音字母加上y结尾的单词,去掉y加ies;

(注:英文字母中,除了a、e、i、o、u这5个元音字母外,其他都是辅音字母)

请编写一段程序,输入n(1≤n≤1000)个英文单词(单数,仅包含小写字母),并按以上规则变成复数形式。

输入描述:

输入n(1≤n≤1000)个英文单词(单数,仅包含小写字母),单词之间以空格隔开

输出描述:

输出这组单词按以上规则变成的复数形式,单词之间以空格隔开


输入样例:

teacher box butterfly

输出样例:

teachers boxes butterflies

参考答案:根据题目要求,我们需要编写一段程序,输入n(1≤n≤1000)个英文单词(单数,仅包含小写字母),并按题目中给出的规则变成复数形式。首先,我们需要读取输入的单词数量n和n个单词。由于题目中限制了input()括号中不允许添加任何提示语,因此我们需要使用其他方式读取输入。一种可行的方式是使用sys模块的stdin.readline()函数来读取输入。然后,我们需要遍历每个单词,并根据题目中给出的规则将其变成复数形式。具体实现如下:1. 如果单词以s、sh、ch、x结尾,直接在其后加上es;2. 如果单词以辅音字母加上y结尾,去掉y加上ies;3. 否则,直接在单词后加上s。最后,我们将所有复数形式的单词输出到屏幕上,单词之间以空格隔开。

解析:【喵呜刷题小喵解析】:
本题是一道英文单词复数形式的编程题目,需要编写一段程序来将输入的n个英文单词变成复数形式。题目中给出了将单词变成复数形式的规则,包括常规情况下结尾直接加s、以s、sh、ch、x结尾的单词加es、以辅音字母加上y结尾的单词去掉y加ies等。

在编写程序时,需要注意以下几点:

1. 读取输入的方式需要符合题目要求,不能使用input()函数,可以使用sys模块的stdin.readline()函数来读取输入。
2. 遍历每个单词时,需要根据题目中给出的规则将其变成复数形式。
3. 输出结果时,需要将所有复数形式的单词输出到屏幕上,单词之间以空格隔开。

需要注意的是,本题中没有给出单词长度的限制,因此在实际编写程序时,需要对输入的单词长度进行判断,避免越界等问题。另外,题目中也没有给出单词中是否包含空格、标点符号等字符的限制,因此在编写程序时,需要对输入的单词进行合法性判断,避免程序出错。

5、啤酒兑换

时间限制:1s

内存限制:128mb

(注:input()括号中不允许添加任何提示语)

某啤酒品牌正在举办一次促销优惠活动。凭3个啤酒瓶可以再换一瓶啤酒,凭5个瓶盖也可以再换一瓶啤酒,换来的啤酒可以继续换,但不允许赊账。

请编写一段程序,计算一个人初始买入n(1≤n≤100)瓶啤酒后,最终他最多能得到多少瓶啤酒,并将这个结果输出。

输入描述:

输入一个正整数n,表示初始买入的啤酒瓶数(1≤n≤100)

输出描述:

输出一个正整数,表示最终能得到的啤酒数


输入样例:

10

输出样例:

19

参考答案:br />输入n,输出最多得到的啤酒数。

解析:【喵呜刷题小喵解析】
本题是一道模拟题,需要根据题目描述的规则,模拟计算一个人初始买入n瓶啤酒后,最终最多能得到多少瓶啤酒。

我们可以使用一个循环来模拟这个过程,直到不能再换啤酒为止。每次循环,判断当前瓶数能否换成新的啤酒,如果可以,则加上新换到的啤酒数,并减去相应的瓶数或瓶盖数。

具体实现时,我们可以维护两个变量,分别表示当前拥有的瓶数和瓶盖数。初始时,瓶数和瓶盖数都为0,然后读入初始买入的啤酒瓶数。接下来,进入一个循环,直到当前拥有的瓶数或瓶盖数小于兑换啤酒所需的数量。

在每次循环中,我们判断当前拥有的瓶数能否兑换新的啤酒。如果可以,我们计算出能够兑换到的啤酒数,将瓶数减去兑换所需的数量,并加上新兑换到的啤酒数。如果当前拥有的瓶盖数能够兑换新的啤酒,我们同样进行处理。

最终,我们输出最终得到的啤酒数。

由于本题要求输出的是最多能得到的啤酒数,因此我们需要保证在每次循环中,都尽可能多地兑换啤酒。具体来说,我们应该先判断当前拥有的瓶数能否兑换新的啤酒,如果可以,则优先使用瓶数进行兑换。如果瓶数不足,再使用瓶盖进行兑换。

以下是示例代码:


```python
n = int(input())
bottles = n
caps = 0
result = n
while bottles >= 3 or caps >= 5:
if bottles >= 3:
new_bottles = bottles // 3
bottles -= 3 * new_bottles
result += new_bottles
if caps >= 5:
new_caps = caps // 5
caps -= 5 * new_caps
result += new_caps
if bottles >= 3:
new_bottles = bottles // 3
bottles -= 3 * new_bottles
result += new_bottles
if caps >= 5:
new_caps = caps // 5
caps -= 5 * new_caps
result += new_caps
print(result)
```
该代码首先读入初始买入的啤酒瓶数,然后进入一个循环,直到当前拥有的瓶数或瓶盖数不足兑换啤酒所需的数量。在每次循环中,我们先判断当前拥有的瓶数能否兑换新的啤酒,如果可以,则优先使用瓶数进行兑换。如果瓶数不足,再使用瓶盖进行兑换。最终输出最终得到的啤酒数。

6、反转递增串

时间限制:1s

内存限制:128mb

(注:input()括号中不允许添加任何提示语)

编写一段程序,输入一个n(2≤n≤1000)位正整数,将其中所有递增数字子串进行反转。

例如,正整数12387645包含两个递增数字子串1238和45,将这两部分进行反转,得到最终的83217654。

输入描述:

输入一个n(2≤n≤1000)位正整数

输出描述:

输出一行,为将输入中所有递增数字子串进行反转的结果


输入样例1:

12387645

输出样例1:

83217654


输入样例2:

87654321

输出样例2:

87654321

参考答案:```pythonn = int(input())s = str(n)res = ''inc_num = ''for i in range(len(s)):if i == 0 or s[i] > s[i-1]:inc_num += s[i]else:res += inc_num[::-1] + s[i]inc_num = ''res += inc_num[::-1]print(res)```

解析:【喵呜刷题小喵解析】:

本题要求将输入的正整数中的递增数字子串进行反转。我们可以遍历输入的每一位数字,判断当前位与前一位的大小关系,从而确定是否开始一个新的递增数字子串。

具体步骤如下:

1. 首先,将输入的整数转换为字符串,方便后续处理。
2. 初始化一个空字符串`res`用于存储最终结果,以及一个空字符串`inc_num`用于存储当前递增数字子串。
3. 遍历输入的每一位数字,如果当前位大于前一位,则将当前位加入`inc_num`中;否则,将`inc_num`反转并加入到`res`中,然后将当前位加入`res`和`inc_num`中。
4. 最后,将剩余的`inc_num`反转并加入到`res`中。
5. 输出`res`即可。

以上算法的时间复杂度为O(n),其中n为输入整数的位数。

7、包围黑子块

时间限制:1s

内存限制:128mb

(注:input()括号中不允许添加任何提示语)

小张发明了一种新式的棋类游戏——战斗棋。在“战斗棋”中,棋子分为黑、白两色。有一条重要的规则叫做“包围败地”。即,横竖相连的同色棋子算成一块棋,一块棋被对方棋子横竖包围起来就算一块“败地”,棋盘边角也算是包围。

现有一片战斗棋区域,包含N * M(1≤N≤100,1≤M≤100)个落子点,所有落子点均摆满了棋子,其中1代表黑子、0代表白子。

请编写一段程序,计算并输出这片区域中被包围的黑色败地数量。

输入描述:

第一行输入2个正整数N和M(1≤N≤100,1≤M≤100),N表示区域的行数,M表示区域的列数,正整数之间以一个空格隔开

接下来的N行每行包括M个数字(数字只能为1或0),1表示黑子,0表示白子,数字之间以一个空格隔开

输出描述:

输出一个正整数,表示N * M的区域中被包围的黑色败地数量


输入样例:

5 3
1 0 1
0 1 0
0 1 0
1 0 1
0 0 0

输出样例:

5

参考答案:```pythondef count_black_defeated_areas(N, M, board):def dfs(i, j):if i < 0 or i >= N or j < 0 or j >= M or board[i][j] != 1:returnboard[i][j] = 2dfs(i - 1, j)dfs(i + 1, j)dfs(i, j - 1)dfs(i, j + 1)def count_defeated_areas():count = 0for i in range(N):for j in range(M):if board[i][j] == 1:dfs(i, j)if all(board[x][j] == 2 for x in range(i - 1, i + 2)) and \all(board[i][y] == 2 for y in range(j - 1, j + 2)):count += 1return countN, M = map(int, input().split())board = [list(map(int, input().split())) for _ in range(N)]return count_defeated_areas()print(count_black_defeated_areas())```

解析:【喵呜刷题小喵解析】:
本题要求计算并输出一片区域中被包围的黑色败地数量。首先,我们可以定义一个深度优先搜索(DFS)函数,用来将每个黑子的相邻格子标记为2。然后,我们可以遍历整个棋盘,统计标记为2的格子的数量,即被包围的黑子数量。

首先,我们需要读入棋盘的尺寸和每个格子上的棋子。输入样例的第一行表示棋盘的尺寸,接下来的N行每行包括M个数字,1表示黑子,0表示白子。

然后,我们定义一个二维数组board,用于存储棋盘的状态。其中,1表示黑子,0表示白子,2表示被标记的格子。

接着,我们定义DFS函数,用于将每个黑子的相邻格子标记为2。在DFS函数中,我们首先检查当前格子的坐标是否越界,以及当前格子是否为黑子。如果是,我们将当前格子标记为2,并递归地标记其相邻的格子。

最后,我们定义count_defeated_areas函数,用于统计被包围的黑子数量。我们遍历整个棋盘,如果当前格子为黑子,我们调用DFS函数将其相邻的格子标记为2。然后,我们检查当前格子的上下左右四个相邻格子是否都被标记为2,如果是,说明当前格子被包围,我们将计数器count加1。

最后,我们调用count_black_defeated_areas函数,将计算结果打印出来。

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

创作类型:
原创

本文链接:2023年NOC大赛_Python软件创意编程赛项_复赛_初中组真题(忽略分值)答案及解析

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