image

编辑人: 青衫烟雨

calendar2025-06-15

message1

visits574

2023年NOC大赛_Python软件创意编程赛项_复赛_小高组真题(忽略分值)参考答案

一、实操题

1、计算年终奖

时间限制:1s

内存限制:128MB

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

某公司的员工年终奖计算规则如下,假设该公司的年度利润为M(单位:万元),若M≤10,则员工年终奖为其本人当月工资的3倍;若10<M≤20,则员工年终奖为其本人当月工资的5倍;若M>20,则员工年终奖为其本人当月工资的8倍。

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

(1)程序运行后,依次输入两个正整数M、m,表示公司的年度利润和员工当月工资;

(2)根据规则计算并输出员工的年终奖金额。

M = int(input())

m = int(input())


if M <= 10:

    ______

___________

m *= 5

____

    ______


print(m) # 输出员工年终奖金额

参考答案:```pythonif M <= 10:m *= 3elif M > 10 and M <= 20:m *= 5else:m *= 8```


2、最大公约数

时间限制:1s

内存限制:128MB

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

欧几里得算法又称辗转相除法,定义是:两个整数的最大公约数等于其中较小的那个数和两数相除余数的最大公约数。因此只要对除数和余数反复做除法运算,当余数为 0 时,当前算式的除数就是最初两个数的最大公约数。

例如:

48除以18,余数为12;

接下来,18除以12,余数为6;

接下来,12除以6,余数为0。

所以,6就是48和18的最大公约数。

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

(1)程序运行后,依次输入两个正整数a、b;

(2)使用欧几里得算法计算a和b的最大公约数,并输出结果。

a = int(input())

b = int(input())

def gcd(a, b):

    if a < b:

        a, b = b, a

    while ______:

        r = _______

        a = b

        b = r

    return _______

print(________) # 输出a和b的最大公约数

参考答案:```pythona = int(input())b = int(input())def gcd(a, b):if a < b:a, b = b, awhile b != 0:r = a % ba = bb = rreturn aprint(gcd(a, b)) # 输出a和b的最大公约数```


3、最少纸币数

时间限制:1s

内存限制:128MB

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

小新使用现金购买一些商品,商品总价值w(1≤w≤10000),他有100元、50元、10元、5元和1元的纸币,每种纸币张数足够多。

请编写一段程序,计算并输出要买到这些商品,最少需要的纸币张数。

输入描述:

输入1个正整数w(1≤w≤10000),表示要购买的商品总价值

输出描述:

第一行输出1个正整数,表示最少需要多少张纸币

第二行依次输出5个正整数,数字之间以空格隔开,分别表示100元至1元纸币所需张数


输入样例:

38

输出样例:

7
0 0 3 1 3

参考答案:br />```pythonw = int(input())num_100 = w // 100w %= 100num_50 = w // 50w %= 50num_10 = w // 10w %= 10num_5 = w // 5w %= 5num_1 = wprint(num_100 + num_50 + num_10 + num_5 + num_1)print(num_100, num_50, num_10, num_5, num_1)```


4、单词变复数

时间限制:1s

内存限制:128MB

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

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

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

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

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

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

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

输入描述:

输入一个英文单词(单数,仅包含小写字母)

输出描述:

输出这个单词按以上规则变成的复数形式


输入样例:

teacher

输出样例:

teachers

参考答案:```pythonword = input()if word[-1] == 's' or word[-1] == 'x' or word[-2:] == 'sh' or word[-2:] == 'ch':plural_form = word + 'es'elif word[-1] == 'y' and word[-2] not in ['a', 'e', 'i', 'o', 'u']:plural_form = word[:-1] + 'ies'else:plural_form = word + 's'print(plural_form)```


5、毕业旅行

时间限制:1s

内存限制:128MB

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

小王要从一个城市出发前往另一个城市进行一场毕业旅行,在此期间会经过m(1≤m≤100)个中转城市。小王给每个城市按顺序设置了一个对他们的喜爱度,分别用a1,a2, ...,am(1≤ ≤100)表示,不同的城市可能拥有相同的喜爱度。现在,小王需要选择k(1≤k≤m)个编号连在一起的中转城市作为重点游览的城市,并希望重点游览的城市喜爱度之和最大。

请编写一段程序,计算并输出小王重点游览的城市喜爱度之和可以获得的最大值。

输入描述:

第一行依次输入两个正整数m和k,依次表示会经过的中转城市数量和重点游览城市数量,正整数之间以空格隔开

第二行依次输入m个正整数,依次表示每个城市的喜爱度 ,正整数之间以空格隔开

输出描述:

输出一个整数,表示小王重点游览的城市喜爱度之和可以获得的最大值


输入样例:

4 2
10 20 15 30

输出样例:

45

参考答案:```pythonm, k = map(int, input().split())cities = list(map(int, input().split()))dp = [0] * (m + 1)for i in range(1, m + 1):dp[i] = dp[i - 1]for j in range(max(0, i - k + 1), i):dp[i] = max(dp[i], dp[j] + cities[j - 1] * (i - j + 1))print(dp[m])```


6、报数游戏

时间限制:1s

内存限制:128MB

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

有n(6≤n≤100)个小伙伴围成一圈做游戏,分别编号为1~n。游戏规则如下:

从第一个人开始依次说出N、O、C三个字母,第一个人说N,第二个人说O,第三个人说C,第四个人再说N,以此类推。如果一个人说到了两次O,那么他就被淘汰,下一个人从C开始继续往后说,直到最终剩下五个小伙伴,这五人即获得游戏的胜利。

例如:有六个小伙伴做游戏,那么1号说N,2号说O,3号说C,4号说N,5号说O,6号说C。

接下来再从1号继续,1号说N,2号说O,此时2号已经是第二次说O,那么2号淘汰,剩下的5个小伙伴的座位号是:1、3、4、5、6。

请编写一段程序,输入参与游戏的人数n(6≤n≤100),输出最终获得游戏胜利的五位小伙伴的座位编号。

输入描述:

输入一个正整数n,代表一共有n个小伙伴参加游戏(6≤n≤100)

输出描述:

由小到大输出获得游戏胜利的五位小伙伴的座位编号,编号之间以空格隔开


输入样例:

6

输出样例:

1 3 4 5 6

参考答案:```pythonn = int(input())last_o_index = 0res = []for i in range(1, n + 1):if i == 2:last_o_index = iif i == last_o_index:last_o_index += 3continueres.append(i)res.sort()print(' '.join(map(str, res[:5])))```


7、两个背包

时间限制:1s

内存限制:128MB

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

现有两个背包和n(2≤n≤500)个物品,n个物品的重量由输入确定,并且均为正整数。

请编写一段程序,判断能否将这n个物品分到两个背包中,使得两个背包中的物品重量相等。如果可以则输出True,不可以则输出False。

输入描述:

一行输入n(2≤n≤500)个正整数,正整数均不超过100,中间以空格隔开,代表每个物品的重量

输出描述:

输出判断结果,True或者False


输入样例:

11 5 1 5

输出样例:

True

参考答案:```pythondef two_backpacks(n, weights):weights.sort() # 将物品按重量从小到大排序mid = len(weights) // 2 # 找到中间位置left_sum = sum(weights[:mid]) # 计算左背包物品重量之和right_sum = sum(weights[mid:]) # 计算右背包物品重量之和if left_sum == right_sum:return Trueelse:return Falsen = int(input())weights = list(map(int, input().split()))print(two_backpacks(n, weights))```


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

创作类型:
原创

本文链接:2023年NOC大赛_Python软件创意编程赛项_复赛_小高组真题(忽略分值)参考答案

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