image

编辑人: 青衫烟雨

calendar2025-08-04

message9

visits501

第14届蓝桥杯Python青少组_国赛_中级组_2023年5月28日真题参考答案

一、单选题

1、以下选项中,哪一个可以将字典dict1与字典dict2合并?()

A dict1.add(dict2)

B dict1.extend(dict2)

C dict1.update(dict2)

D dict1.merge(dict2)


2、执行print("{1}{0}".format("Hello","Python","!"))语句后,输出的结果是()。

A HelloPython!

B PythonHello!

C HelloPython

D PythonHello


3、关于Python中的全局变量和局部变量,以下选项描述错误的是()

A 全局变量不可以被函数内部的代码块修改

B 全局变量在函数之外一般没有缩进,在程序执行全过程有效

C 全局变量是指在函数之外定义的变量,而局部变量是指在函数内部定义的变量

D 局部变量和全局变量可以共存,但如果局部变量和全局变量的名称相同,局部变量会覆盖全局变量


4、下列函数中哪一个可以删除集合中指定的元素?()

A clear()

B discard()

C union()

D issubset()


5、以下选项中,哪一个可以更好地描述Python中类方法和静态方法之间的区别?()

A 类方法只能由类调用,而静态方法只能由实例调用

B 类方法可以访问类和实例的属性和方法,而静态方法不能访问

C 类方法必须要有一个参数,而静态方法可以没有参数

D 类方法只能访问类的属性和方法,而静态方法只能访问实例的属性和方法


二、实操题

6、题目描述:

例如:S ="1Abb",其中字母有A,b,b一共有3个。给定一个字符串S(S长度<100),统计字符串中字母一共有多少个。

【输入描述】

输入一个字符串S(S长度<100)

【输出描述】

输出一个整数,表示字符串S中字母的个数


【样例输入】

1Abb

【样例输出】

3

参考答案:给定一个字符串,我们可以遍历字符串中的每一个字符,然后检查该字符是否是字母。如果是字母,计数器加一。最后,计数器中的值就是字符串中字母的个数。


7、题目描述:

提示信息:

有一个由多个小正六边形组成的蜂巢图案,蜂巢外缘各边的小正六边形数量一致,且左右对称。

(上图蜂巢图案外缘各边小正六边形数量为2)

以下为竖直对称线上小正六边形个数为3、5、7的3个蜂巢图案。

编程实现:

有一只蜗牛要从竖直对称线顶端的小正六边形处移动到底端的小正六边形中,它每次只能向它所在位置的小正六边形的左下方、正下方、右下方相邻的小正六边形处移动。

已知竖直对称线上有N个小正六边形,请计算出蜗牛从竖直对称线顶端移动到底端共有多少条不同的移动路线。

例如:N = 3,竖直对称线上有3个小正六边形,如下图:

蜗牛从竖直对称线顶端的小正六边形处(1号处)移动到另一端的小正六边形中(7号处)共有11条不同的路线。

11条不同的路线分别为:

(1->2->5->7)、(1->2->4->7)、(1->2->4->5->7)、(1->2->4->6->7)、(1->4->5->7)、(1->4->7)、(1->4->6->7)、(1->3->4->5->7)、(1->3->4->7)、(1->3->4->6->7)、(1->3->6->7)。

【输入描述】

输入一个正整数N(2<N<30,N为奇数),表示图案上竖直对称线上小正六边形的个数

【输出描述】

输出一个整数,表示蜗牛从竖直对称线顶端移动到底端共有多少条不同的移动路线


【样例输入】

3

【样例输出】

11


参考答案:根据题目描述,蜗牛从竖直对称线顶端移动到底端共有多少条不同的移动路线可以通过动态规划来解决。可以使用一个二维数组dp来保存中间结果,其中dp[i][j]表示蜗牛从竖直对称线顶端到第i个小正六边形,并且选择了j条左移路线(不包括正下方的路线)的方案数。根据蜗牛的移动规则,可以得到状态转移方程:dp[i][j] = dp[i-1][j] + dp[i-2][j-1]其中,dp[i-1][j]表示蜗牛从竖直对称线顶端到第i-1个小正六边形,并且选择了j条左移路线(不包括正下方的路线)的方案数,dp[i-2][j-1]表示蜗牛从竖直对称线顶端到第i-2个小正六边形,并且选择了j-1条左移路线(不包括正下方的路线)的方案数,然后正下方走一步到达第i个小正六边形。初始条件为:dp[1][0] = 1,表示只有一条路线,即蜗牛直接走到正下方的小正六边形;dp[2][0] = 1,dp[2][1] = 1,表示有两条路线,即蜗牛可以走到正下方或者左移一步再走到正下方的小正六边形。最后,蜗牛从竖直对称线顶端到第N个小正六边形的方案数即为dp[N][0] + dp[N][1] + ... + dp[N][(N-1)/2]。


8、题目描述:

某公司有多间会议室,可使用时间为8点到22点,同一会议室同一时间段只能由一个部门使用。

一天有N(1<=N<=50)个部门计划使用同一间会议室,且已知每个部门计划使用的开始时间S(8<=S<=21)和结束时间E(S<E<=22)。请计算出这间会议室最多可以安排多少个部门使用。

例如:N = 3,3个部门计划使用的开始及结束时间依次为(9,12),(10,15),(15,20)。

10~12点的时间段,部门1和部门2都计划使用,所以只能由一个部门使用;15~20点的时间段,只有部门3计划使用,所以这间会议室最多可以安排2个部门使用(部门1和部门3或者部门2和部门3)。

【输入描述】

第一行输入一个正整数N(1<=N<=50),表示计划使用同一间会议室的部门数量接下来输入N行,每行两个正整数S和E(8<=S<=21,S<=E<=22),分别表示某部门计划使用会议室的开始时间和结束时间,正整数之间以一个空格隔开

【输出描述】

输出一个整数,表示这间会议室最多可以安排多少个部门使用


【样例输入】

3
9 12
10 15
15 20

【样例输出】

2

参考答案:对于这个问题,我们可以使用贪心算法来解决。首先,将每个部门的开始时间和结束时间按照开始时间从小到大排序。然后,从第一个部门开始,尽可能安排更多的部门,只要它们的时间段没有重叠。具体步骤如下:1. 将所有部门的开始时间和结束时间按照开始时间从小到大排序。2. 初始化一个计数器,用于记录已经安排的部门数量。3. 遍历排序后的部门列表,对于每个部门:* 如果当前部门的时间段与前一个部门的时间段没有重叠(即当前部门的开始时间大于前一个部门的结束时间),则更新计数器,表示又安排了一个部门。* 否则,跳过当前部门,继续遍历下一个部门。4. 遍历结束后,返回计数器的值,即为最多可以安排的部门数量。


9、题目描述:

小贝要做一份黑暗料理,现有N(2≤N≤20)种不同的食材供她选择,食材编号从1到N。其中有些食材同时食用会产生副作用,所以产生副作用的食材只能选择其中一种食材或者都不选择。

已知同时食用会产生副作用的食材有M对(0≤M≤N*(N-1)/2),请计算出这份黑暗料理中最多能有多少种食材。

注意:会产生副作用的食材以两个编号表示,两个编号不等且编号小的在前,例如(1,2)和(2,3)。

例如:N=5,M=3时,5种食材编号为1到5,其中有3对食材会产生副作用:(1,2)、(2,3)、(4,5)。

可选择1、3、4号食材或1、3、5号食材做黑暗料理,最多可以有3种食材。

【输入描述】

第一行输入两个正整数N(2≤N≤20)和M(0≤M≤N*(N-1)/2),分别表示食材数量及会产生副作用的食材对数,两个正整数之间以一个空格隔开接下来输入M行,每行两个正整数(1≤正整数≤N),表示会产生副作用的两种食材编号,两个正整数之间以一个空格隔开,两个编号不等且编号小的在前

【输出描述】

输出一个整数,表示这份黑暗料理中最多能有多少种食材


【样例输入】

5 3
1 2
2 3
4 5

样例输出

3


参考答案:```#include #include #include using namespace std;int maxIngredients(int N, int M, vector> pairs) vector used(N + 1, 0);for (auto p : pairs) {used[p.first] = 1;used[p.second] = 1;}int maxIngredientsCount = 0;for (int i = 1; i <= N; i++) {if (used[i] == 0) {maxIngredientsCount++;for (auto p : pairs) {if (p.first == i) {used[p.second] = 1;}}}}return maxIngredientsCount;int main() int N, M;cin >> N >> M;vector> pairs(M);for (int i = 0; i < M; i++) {int a, b;cin >> a >> b;pairs[i] = {a, b};}sort(pairs.begin(), pairs.end(), [](pair p1, pair p2) {return p1.first < p2.first || (p1.first == p2.first && p1.second < p2.second);});int maxIngredients = 0;for (int i = 1; i <= N; i++) {int ingredients = 0;vector used(N + 1, 0);for (auto p : pairs) {if (p.first == i) {ingredients++;used[p.second] = 1;}}maxIngredients = max(maxIngredients, ingredients);}cout << maxIngredients << endl;return 0;```


10、题目描述:

小蓝从公司出发,要去拜访N(3≤N≤15)个客户,已知公司到每个客户的路程时间,及N个客户之间的路程时间。请计算出小蓝拜访完所有客户并返回到公司,最少需要多少时间。(道路双向通行,可重复走)

例如:N = 3,有3个客户需要拜访,公司到1号、2号、3号客户的路程时间依次为9,7,5,客户1到客户2和客户3的路程时间依次是4,6,客户2到客户3的路程时间是3。

从公司出发拜访完3名客户并返回公司最少需要的路程时间为21,行走路线为:公司 --> 3号 --> 2号 --> 1号--> 公司(21=5+3+4+9)。

【输入描述】

1)第一行输入一个正整数N(3≤N≤15),表示要拜访的客户数量

2)第二行输入N个正整数(1≤正整数≤1000),依次表示公司到1号~N号客户的路程时间,正整数之间以一个空格隔开

3)第三行输入N-1个正整数(1≤正整数≤1000),依次表示1号客户到2号~N号客户的路程时间,正整数之间以一个空格隔开

4)第四行输入N-2个正整数(1≤正整数≤1000),依次表示2号客户到3号~N号客户的路程时间,正整数之间以一个空格隔开

......

第N+1行输入一个正整数(1≤正整数≤1000),表示N-1号客户到N号客户的路程时间

【输出描述】

输出一个整数,表示小蓝拜访完N名客户并返回公司最少需要的路程时间


【样例输入】

3
9 7 5
4 6
3

【样例输出】

21


参考答案:对于这个问题,我们可以使用动态规划来解决。首先,我们需要定义一个二维数组dp,其中dp[i][j]表示从客户i到客户j的最短时间。然后,我们可以使用动态规划的思想,从前往后依次计算dp[i][j]的值。具体步骤如下:1. 初始化dp数组,将dp[i][i]的值设为从公司到客户i的时间。2. 对于每个客户i,从后往前遍历客户j,更新dp[i][j]的值为从公司到客户i的时间加上从客户j到客户i的时间与从公司到客户j的时间加上从客户j到客户i+1的时间加上从客户i+1到客户i的时间中的较小值。3. 最后,返回dp[1][N]的值,即从客户1到客户N的时间加上从客户N到客户1的时间,即为小蓝拜访完所有客户并返回到公司所需的最少时间。


11、题目描述:

有一组正整数数据,现对这组数据按照如下操作:

1)从这组数中找出两个相邻且相同的数,删掉其中一个数,剩下的一个数加1(例如:两个相邻的6,变成一个7);

2)重复操作第1步,直到这组数据中没有相邻且相同的数时,操作结束。

现给定N(1≤N≤2000)个正整数,表示这一组数,请问按照要求操作结束后,这组数据中最大的数是多少。

注意:不同的操作方式得到的最后结果不同,要求最后的结果是所有操作方式中最大的。

例如:

当N=6,这组数为 1、2、2、2、3、4时,

可获得最大结果的操作如下:

第一次操作:将这组数据中后两个相邻的2,变成3,此时这组数变为1,2,3,3,4;

第二次操作:将这组数据中两个相邻的3,变成4,此时这组数变为1,2,4,4;

第三次操作:将这组数据中两个相邻的4,变成5,此时这组数变为1,2,5;

此时这组数据中没有相邻且相同的数,操作结束,最大的数是5。

非最大结果的操作如下:

第一次操作:将这组数据中前两个相邻的2,变成3,此时这组数变为1,3,2,3,4;

此时这组数据中没有相邻且相同的数,操作结束,最大的数是4。

所以按照要求操作结束后,这组数据中可获得的最大数是5。

【输入描述】

第一行输入一个正整数N(1≤N≤2000)

第二行输入N个正整数(1≤正整数≤40),相邻两个数之间以一个空格隔开

【输出描述】

输出一个正整数,表示所有操作方式中最大的结果


【样例输入】

6
1 2 2 2 3 4

【样例输出】

5


参考答案:根据题目描述,我们需要对给定的一组正整数数据进行操作,每次操作找出两个相邻且相同的数,删掉其中一个数,剩下的一个数加1,直到这组数据中没有相邻且相同的数。要求找出所有操作方式中最大的结果。为了解决这个问题,我们可以使用贪心算法。首先,我们遍历这组数据,找到第一个相邻且相同的数对,然后按照题目要求进行操作,直到这组数据中没有相邻且相同的数。这样操作后,这组数据中最大的数即为最终结果。具体实现步骤如下:1. 初始化一个变量max_num为0,用于记录最终结果。2. 遍历这组数据,找到第一个相邻且相同的数对,假设为num1和num2。3. 如果num1和num2相等,则将num1或num2删除,将剩下的数加1,并将max_num更新为加1后的数。4. 如果num1和num2不相等,则继续遍历下一个数对。5. 重复步骤2-4,直到这组数据中没有相邻且相同的数对。6. 返回max_num作为最终结果。根据题目描述,我们需要遍历数据多次,因此时间复杂度为O(n),其中n为数据长度。由于题目要求输出最大结果,因此空间复杂度为O(1)。


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

创作类型:
原创

本文链接:第14届蓝桥杯Python青少组_国赛_中级组_2023年5月28日真题参考答案

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