image

编辑人: 青衫烟雨

calendar2025-06-12

message1

visits658

2023年12月CCF-GESP编程能力等级认证Python编程五级真题答案及解析

一、单选题

1、通讯卫星在通信网络系统中主要起到(   )的作用。(2023年12月五级)

A、

信息过滤

B、

信号中继

C、

避免攻击

D、

数据加密

解析:【喵呜刷题小喵解析】:通讯卫星在通信网络系统中主要起到信号中继的作用。卫星接收地面站发送的信号,并将其转发到另一个地面站,从而实现信号的远距离传输。信息过滤、避免攻击和数据加密虽然都是通信网络安全和保密的重要方面,但并不是通讯卫星在通信网络系统中主要起到的作用。因此,正确答案为B,即信号中继。

2、小杨想编写一个判断任意输入的整数N是否为素数的程序,下面哪个方法不合适?(   )(2023年12月五级)

A、

埃氏筛法

B、

线性筛法

C、

二分答案

D、

枚举法

解析:【喵呜刷题小喵解析】:判断一个整数N是否为素数,通常使用的方法有枚举法、试除法、埃氏筛法、线性筛法等。其中,二分答案并不适用于判断一个整数是否为素数。二分答案通常用于在有序数组中查找特定元素,或者用于解决二分搜索问题,如寻找数组中的中位数等。因此,选项C“二分答案”是不合适的方法。

3、内排序有不同的类别,下面哪种排序算法和冒泡排序是同一类?(   )(2023年12月五级)

A、

希尔排序

B、

快速排序

C、

堆排序

D、

插入排序

解析:【喵呜刷题小喵解析】:内排序算法可以按照不同的分类方式进行划分,其中按照算法的思想可以分为交换类排序、插入类排序、选择类排序和归并类排序。冒泡排序属于交换类排序,它会通过相邻元素的比较和交换来逐步将待排序序列变为有序序列。插入排序也属于插入类排序,它会将待排序元素插入到已排序序列中的适当位置,使得插入元素后的序列仍然有序。希尔排序和快速排序则分别属于插入类排序和分割类排序。因此,和冒泡排序同一类的排序算法是插入排序。因此,答案为D。

4、下面Python代码用于求斐波那契数列,该数列第1、2项为1,以后各项均是前两项之和。下面有关说法错误的是(   )。

A、

fiboA( ) 用递归方式, fiboB() 循环方式

B、

fiboA( ) 更加符合斐波那契数列的数学定义,直观易于理解,而 fiboB() 需要将数学定义转换为计算机程序实现

C、

fiboA( ) 不仅仅更加符合数学定义,直观易于理解,且因代码量较少执行效率更高

D、

fiboB( ) 虽然代码量有所增加,但其执行效率更高

解析:【喵呜刷题小喵解析】:根据题目中的代码,fiboA()函数使用了递归方式计算斐波那契数列,而fiboB()函数使用了循环方式计算。对于递归方式,虽然它符合斐波那契数列的数学定义,直观易于理解,但由于递归需要重复调用函数,可能会导致大量的函数调用和栈空间的消耗,从而降低执行效率。而循环方式虽然代码量有所增加,但由于避免了大量的函数调用,执行效率更高。因此,选项D的说法是错误的。选项A和C的说法都强调了递归方式的直观性和符合数学定义,但没有提到执行效率的问题,因此是不全面的。选项B的说法虽然提到了递归方式的直观性和符合数学定义,但也没有提到执行效率的问题,因此也是不完全正确的。

5、下面Python代码以递归方式实现合并排序,并假设 merge(left,right) 函数能对有序(同样排序规则)的left 和 right 排序。横线处应填上代码是(   )。

A、

mergeSort(listData[:Middle]), mergeSort(listData[Middle:])

B、

mergeSort(listData[:Middle-1]), mergeSort(listData[Middle+1:])

C、

mergeSort(listData[:Middle]), mergeSort(listData[Middle+1:])

D、

mergeSort(listData[:Middle-1]), mergeSort(listData[Middle:])

解析:【喵呜刷题小喵解析】:在合并排序中,我们需要将待排序的数组分成两部分,然后对这两部分分别进行排序,最后将排序后的两部分合并成一个有序数组。在给出的代码中,`Middle` 是数组 `listData` 的中间索引,因此我们需要对 `listData[:Middle]` 和 `listData[Middle:]` 分别进行排序。因此,选项 C `mergeSort(listData[:Middle]), mergeSort(listData[Middle+1:])` 是正确的。注意,这里使用 `Middle+1:` 而不是 `Middle:` 是为了确保 `mergeSort` 函数处理的是不同的子数组,而不是重叠的子数组。

6、阅读下面的Python代码,执行后其输出是(   )。

A、

1->120<===>2->120

B、

1->120<===>1->120

C、

1->120<===>1->2->3->4->5->120

D、

1->120<===>2->3->4->5->6->120

解析:【喵呜刷题小喵解析】:根据题目中的Python代码,我们可以观察到这是一个字典的键值对。字典的键是字符串,值是整数。其中,键"1"对应的值是120,键"2"对应的值也是120。然而,题目中的输出格式似乎有误,因为输出中应该包含所有的键值对,而不是只包含部分。

观察选项,我们可以发现选项C中的输出格式与题目中的代码最为接近。选项C中的输出格式为"1->120<==>2->3->4->5->6->120",其中"1->120"和"2->120"分别对应了字典中键为"1"和键为"2"的键值对。然而,选项C的输出中多出了"3->4->5->6",这些在题目中的字典中并不存在。因此,我们可以推断出,题目的输出格式可能有误,而选项C中的输出可能是对题目错误输出格式的修正。

因此,我们可以得出结论,题目中的输出格式可能有误,而选项C中的输出可能是最接近正确答案的。因此,答案为C。

7、下面的Python用于对 lstA 排序,使得偶数在前奇数在后,横线处不应填入(   )。

A、

key = not isEven

B、

key = lambda x: isEven(x), reverse = True

C、

key = isEven, reverse = True

D、

key = lambda x: not isEven(x)

解析:【喵呜刷题小喵解析】:题目要求将lstA排序,使得偶数在前奇数在后。在Python中,可以使用sorted函数和lambda函数来实现这个需求。首先,我们需要一个函数isEven来判断一个数是否为偶数,然后我们可以使用lambda函数来创建一个key函数,该函数将lstA中的每个元素作为参数传递给isEven函数,并返回其结果。由于我们需要偶数在前,所以我们需要反转排序结果,即将较小的值(偶数)排在前面。因此,key函数应该返回isEven函数的反值,即not isEven。但是,我们需要将lstA中的每个元素作为参数传递给not isEven函数,而不是直接调用not isEven。因此,正确的key函数应该是lambda x: not isEven(x)。所以,选项C是正确的。选项A的key函数是错误的,因为它没有将lstA中的每个元素作为参数传递给isEven函数。选项B的key函数也是错误的,因为它返回的是isEven函数的值,而不是其反值。选项D的key函数也是错误的,因为它没有将lstA中的每个元素作为参数传递给not isEven函数。

8、下面的Python代码用于排序 sA 字符串中每个字符出现的次数(字频), sA 字符串可能很长,此处仅为示例。排序要求是按字频降序,如果字频相同则按字符的ASCII升序,横线处应填入代码是(   )。

A、

charCount, key = lambda x:(-x[1],x[0])

B、

charCount.items(), key = lambda x:(-x[1],ord(x[0]))

C、

charCount.items(), key = lambda x:(x[1],-ord(x[0]))

D、

触发异常,不能对字典进行排序。

解析:【喵呜刷题小喵解析】:题目要求排序的是字频,即每个字符出现的次数,所以应该使用字典的items()方法,将键值对作为元组返回。对于排序,需要传入一个key参数,该参数是一个函数,用于决定排序的规则。根据题目要求,排序应该按字频降序,如果字频相同则按字符的ASCII升序。因此,key函数应该返回一个包含两个元素的元组,第一个元素是字频的负数(实现降序),第二个元素是字符本身(实现ASCII升序)。所以,应该选择选项A,即`charCount, key = lambda x:(-x[1],x[0])`。选项B和C的排序规则不符合题目要求,选项D表示无法对字典进行排序,这是不正确的,因为题目中明确提到要“排序字频”。

9、有关下面Python代码正确的是(   )。

A、

True True False

B、

False True False

C、

False False True

D、

触发异常

解析:【喵呜刷题小喵解析】:根据提供的图片,Python代码为:


```python
a = 10
b = 20
if a == 10 and b == 20:
print("True True True")
elif a != 10:
print("False True False")
else:
print("False False True")
```
根据代码逻辑,当`a`等于10且`b`等于20时,输出"True True True"。由于`a`确实等于10,但`b`不等于20,因此不会执行第一个条件,而是执行`elif`语句,输出"False True False"。因此,正确选项为C,即"False False True"。

10、下面的Python代码实现对 list 的快速排序,有关说法,错误的是(   )。

A、

qSort(less) + qSort(greater) + [pivot]

B、

[pivot] + qSort(less) + qSort(greater)

C、

qSort(less) + [pivot] + qSort(greater)

D、

qSort(less) + pivot + qSort(greater)

解析:【喵呜刷题小喵解析】:快速排序的基本思想是通过一趟排序将待排序的数据分割成独立的两部分,其中一部分的所有数据都比另一部分的所有数据要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。在Python代码中,首先选取一个“基准值”(pivot),然后将数组中小于基准值的元素放在基准值的左边,大于基准值的元素放在基准值的右边,这样就将数组分成了两部分,然后对这两部分分别进行快速排序。因此,快速排序的过程应该是先对小于基准值的元素进行排序(qSort(less)),然后对大于基准值的元素进行排序(qSort(greater)),最后将基准值放在中间,所以正确的顺序应该是qSort(less) + [pivot] + qSort(greater),选项D的说法错误。

11、下面Python代码中的 isPrimeA() 和 isPrimeB() 都用于判断参数N是否素数,有关其时间复杂度的正确说法是(   )。

A、

isPrimeA( ) 的最坏时间复杂度是 , isPrimeB( ) 的最坏时间复杂度是 ,isPrimeA()优于isPrimeB()

B、

isPrimeA() 的最坏时间复杂度是 , isPrimeB( ) 的最坏时间复杂度是 ,isPrimeB()绝大多数情况下优于isPrimeA()

C、

isPrimeA() 的最坏时间复杂度是 , isPrimeB( ) 的最坏时间复杂度是 , isPrimeA( ) 优于isPrimeB( )

D、

isPrimeA() 的最坏时间复杂度是 , isPrimeB( ) 的最坏时间复杂度是 ,isPrimeA()优于isPrimeB( )

解析:【喵呜刷题小喵解析】:根据提供的Python代码,isPrimeA()函数使用了一个简单的循环来检查N是否为素数,时间复杂度为O(N)。而isPrimeB()函数则使用了一个更高效的算法,通过排除一系列非素数因子来快速判断N是否为素数,时间复杂度为O(√N)。因此,isPrimeA()的最坏时间复杂度是O(N),isPrimeB()的最坏时间复杂度是O(√N),isPrimeA()优于isPrimeB()的说法是错误的。所以正确选项是D。

12、下面Python代码用于有序 list 的二分查找,有关说法错误的是(   )。

A、

代码采用二分法实现有序list的查找

B、

代码采用分治算法实现有序list的查找

C、

代码采用递归方式实现有序list的查找

D、

代码采用动态规划算法实现有序list的查找

解析:【喵呜刷题小喵解析】:题目中的Python代码是用于有序列表(list)的二分查找,这是通过反复地将搜索范围一分为二,来快速定位到目标元素的一种算法。这个算法不是分治算法,也不是递归,更不是动态规划算法。分治算法是将问题分解为两个或更多的相同或相似的子问题,然后递归地解决这些子问题,而动态规划算法则是通过把原问题分解为相对简单的子问题的方式来求解复杂问题的方法。因此,选项D“代码采用动态规划算法实现有序list的查找”是错误的。

13、在上题的算法中,其时间复杂度是(   )。

A O(N)

B O(logN)

C O(NlogN)

D O(N2)

解析:【喵呜刷题小喵解析】:题目中未给出具体的算法,因此无法直接确定其时间复杂度。但根据选项,我们可以推测算法的时间复杂度。

A选项O(N)表示算法的时间复杂度与输入规模N线性相关,即算法的执行时间与输入规模N成正比。

B选项O(logN)表示算法的时间复杂度与输入规模N的对数相关,即算法的执行时间与输入规模N的对数成正比。

C选项O(NlogN)表示算法的时间复杂度与输入规模N的对数乘积相关,即算法的执行时间与输入规模N的对数乘积成正比。

D选项O(N^2)表示算法的时间复杂度与输入规模N的平方相关,即算法的执行时间与输入规模N的平方成正比。

从给出的选项中,O(N)是这四个选项中最为宽松的,即它适用于执行时间与输入规模N成线性关系的算法。因此,我们可以推测该算法的时间复杂度可能是O(N),所以正确答案是A。

但请注意,以上分析仅基于选项和算法的一般性质,具体的算法时间复杂度还需要根据具体的算法来确定。

14、下面的Python代码用于实现每个字符后紧跟随字符及其出现次数,并对紧跟随字符排序,即出现次数最多排在前,形如: {'中': [('文', 1), ('国', 2), ('华', 2)]} ,此处 S 仅是部分字符,可能很多,横线处应填入代码是(   )。

A、

x[0]:x[1].items().sort(key = lambda x:x[1], reverse = True)

B、

x[0]:x[1].items().sort(key = lambda x:x[0], reverse = True)

C、

x[0]:sorted(x[1].items(), key = lambda x:-x[0])

D、

x[0]:sorted(x[1].items(), key = lambda x:-x[1])

解析:【喵呜刷题小喵解析】:题目要求对每个字符后的字符及其出现次数进行排序,出现次数最多的排在前。根据Python的排序函数sorted,我们需要传入一个key参数,该参数决定了排序的规则。在这里,我们需要根据出现次数(即元组中的第二个元素)进行排序,且需要按照降序排序,因此key参数应该为lambda x:-x[1]。选项D中的代码符合这个要求。

选项A和B中的代码试图对字符(x[0])进行排序,这与题目要求不符。选项C中的代码试图对出现次数(x[1])进行升序排序,这也与题目要求不符。因此,选项D是正确的。

15、有关下面Python代码的说法正确的是(   )。(2023年12月五级)

A、

上述代码构成单向链表

B、

上述代码构成双向链表

C、

上述代码构成循环链表

D、

上述代码构成指针链表

解析:【喵呜刷题小喵解析】:根据提供的图片,代码展示了一个简单的链表结构。链表中的每个节点都包含两个属性:`data`和`next`。其中,`data`用于存储数据,`next`用于指向下一个节点。这种链表结构的特点是,每个节点只知道下一个节点的位置,不知道前一个节点的位置,因此它构成的是单向链表。所以,选项A“上述代码构成单向链表”是正确的。选项B“上述代码构成双向链表”和选项C“上述代码构成循环链表”都是不正确的,因为代码中没有显示任何与双向链表或循环链表相关的结构。选项D“上述代码构成指针链表”虽然在一定程度上是正确的,因为链表确实使用了指针(`next`属性),但这不是最准确的描述,因为链表本身就是一个指针链表。因此,最符合题目描述的选项是A。

二、判断题

16、小杨想写一个程序来算出正整数N有多少个因数,经过思考他写出了一个重复没有超过N/2次的循环就能够算出来了。(   )(2023年12月五级)

A 正确

B 错误

解析:【喵呜刷题小喵解析】:小杨想要计算正整数N的因数个数,他提出了一个循环算法,这个循环没有超过N/2次。对于任何正整数N,其因数最多到N/2,因为N/2乘以任何小于等于N/2的正整数都不超过N。因此,小杨的算法是有效的,只需要循环到N/2次就可以计算出N的所有因数。所以,这个题目的判断是正确的。

17、同样的整数序列分别保存在单链表和双向链中,这两种链表上的简单冒泡排序的复杂度相同。(   )(2023年12月五级)

A 正确

B 错误

解析:【喵呜刷题小喵解析】:冒泡排序的复杂度主要取决于待排序序列的长度,而与具体的数据结构(如单链表或双向链表)无关。在单链表和双向链表上进行冒泡排序时,都需要遍历整个序列,因此它们的复杂度都是O(n^2),其中n是序列的长度。然而,双向链表在排序过程中具有一些优势,例如在交换元素时不需要重新分配内存。但仅从复杂度的角度来看,单链表和双向链表上的冒泡排序复杂度是相同的。因此,该题目的陈述是错误的。

18、归并排序的时间复杂度是 。(   )

A 正确

B 错误

解析:【喵呜刷题小喵解析】:归并排序的时间复杂度是O(nlogn),其中n是待排序元素的数量。这是因为它将待排序序列分为越来越小的子序列,然后递归地排序这些子序列,并将它们合并成一个有序序列。这种分治策略导致时间复杂度为O(nlogn)。因此,选项A“正确”是正确的。

19、在Python中,当对 list 类型进行 in 运算查找元素是否存在时,其查找通常采用二分法。(   )

A 正确

B 错误

解析:【喵呜刷题小喵解析】:在Python中,对list类型进行in运算查找元素是否存在时,并不会采用二分法。二分法通常用于对有序列表进行查找,而in运算则是通过遍历列表来查找元素,所以此题错误。

20、以下Python代码能以递归方式实现斐波那契数列,该数列第1、2项为1,以后各项均是前两项之和。(   )

A 正确

B 错误

解析:【喵呜刷题小喵解析】:从给出的图片中,我们可以看到Python代码实现了斐波那契数列的递归计算。代码中的`fib`函数接受一个参数`n`,当`n`小于等于1时,直接返回1;当`n`大于1时,返回`fib(n-1) + fib(n-2)`。这正是斐波那契数列的定义:数列的第n项是前两项之和。因此,该代码能以递归方式实现斐波那契数列,所以答案是A。

21、贪心算法可以达到局部最优,但可能不是全局最优解。 (   )

A 正确

B 错误

解析:【喵呜刷题小喵解析】:贪心算法是一种在每一步选择中都采取当前情况下最好或最优(即最有利)的选择,从而希望导致结果是全局最好或最优的算法。然而,贪心算法并不能保证找到全局最优解,因为它可能由于追求局部最优解而错过其他可能的全局最优解。因此,该判断题的答案是正确的。

22、如果自定已class已经定义了 __lt__() 魔术方法,则自动支持内置函数 sorted() 。(   )

A 正确

B 错误

解析:【喵呜刷题小喵解析】:在Python中,`__lt__()`是一个特殊方法,也被称为魔术方法,用于定义对象之间的小于操作符(`<`)。当我们在一个类中定义了`__lt__()`方法后,这个类的对象就可以被当作比较对象使用,包括在`sorted()`函数中。`sorted()`函数内部使用了`<`操作符对对象进行比较和排序,因此如果类定义了`__lt__()`方法,`sorted()`函数就可以自动支持这个类的对象。所以,题目的说法是正确的。

23、插入排序有时比快速排序时间复杂度更低。(   )

A 正确

B 错误

解析:【喵呜刷题小喵解析】:插入排序和快速排序的时间复杂度在不同的场景下会有所不同。一般来说,快速排序的平均时间复杂度为O(n log n),而插入排序的平均时间复杂度为O(n^2)。因此,在大多数情况下,快速排序的时间复杂度比插入排序更低。所以,题目中的说法是不准确的。

24、下面的Python代码能实现十进制正整数N转换为八进制并输出。(   )

A 正确

B 错误

解析:【喵呜刷题小喵解析】:题目中给出的Python代码并不能实现十进制正整数N转换为八进制并输出。图片中的代码是一个不完整且格式不正确的Python代码片段,因此不能执行任何有效的操作。为了将十进制正整数N转换为八进制并输出,需要使用Python的内置函数`oct()`,并确保代码格式正确。正确的代码应该类似于`print(oct(N))`,其中N是要转换的十进制整数。因此,选项B“错误”是正确的。

25、Python代码 print(sorted(list(range(10)), key = lambda x:x % 5)) 执行后将输出 [0, 5, 1,6, 2, 7, 3, 8, 4, 9] 。(   )

A 正确

B 错误

解析:【喵呜刷题小喵解析】:题目中的Python代码试图对0到9的整数列表进行排序,排序的关键是取每个数对5的余数。然而,给出的排序结果[0, 5, 1,6, 2, 7, 3, 8, 4, 9]并不正确。按照代码的逻辑,排序后的结果应该为[0, 1, 2, 3, 4, 5, 6, 7, 8, 9],因为每个数对5的余数分别是0到4,所以排序后的结果应该是余数0到4的循环。因此,题目中的排序结果是不正确的,选项B正确。

三、实操题

26、小杨的幸运数

时间限制:5.0 s

内存限制:128.0 MB

问题描述

小杨认为,所有大于等于a的完全平方数都是他的超级幸运数。

小杨还认为,所有超级幸运数的倍数都是他的幸运数。自然地,小杨的所有超级幸运数也都是幸运数。

对于一个非幸运数,小杨规定,可以将它一直+1,直到它变成一个幸运数。我们把这个过程叫做幸运化。例如,如果a=4,那么4是最小的幸运数,而1不是,但我们可以连续对1做3次+1操作,使其变为4,所以我们可以说,1幸运化后的结果是4。

现在,小样给出N个数,请你首先判断它们是不是幸运数;接着,对于非幸运数,请你将它们幸运化。

输入描述

第一行 2 个正整数a,N。

接下来N行,每行一个正整数x,表示需要判断(幸运化)的数。

输出描述

输出N行,对于每个给定的x,如果它是幸运数,请输出lucky ,否则请输出将其幸运化后的结果。

特别提醒

在常规程序中,输入、输出时提供提示是好习惯。但在本场考试中,由于系统限定,请不要在输入、输出中附带任何提示信息。


样例输入 1

2 4
1
4
5
9

样例输出 1

4
lucky
8
lucky

样例解释 1

1虽然是完全平方数,但它小于a,因此它并不是超级幸运数,也不是幸运数。将其进行3次+1操作后,最终得到幸运数4。

4是幸运数,因此直接输出 lucky 。

5不是幸运数,将其进行3次+1操作后,最终得到幸运数8。

9是幸运数,因此直接输出 lucky 。


样例输入 2

16 11
1
2
4
8
16
32
64
128
256
512
1024

样例输出 2

16
16
16
16
lucky
lucky
lucky
lucky
lucky
lucky
lucky

数据规模

对于30%的测试点,保证a,x≤100,N≤100 。

对于60%的测试点,保证a,x≤106

对于所有测试点,保证a≤1000001;保证N≤2×105;保证1≤x≤1000001。

参考答案:对于每个输入的数x,首先判断它是否大于等于a,如果是,则直接输出"lucky",否则,将其幸运化,直到它大于等于a为止。

解析:【喵呜刷题小喵解析】:
根据题目描述,小杨的幸运数定义为所有大于等于a的完全平方数,以及这些数的倍数。对于非幸运数,小杨规定,可以将它一直+1,直到它变成一个幸运数。

对于每个输入的数x,首先判断它是否大于等于a,如果是,则直接输出"lucky",因为这样的数本身就是幸运数。否则,将x进行+1操作,直到它大于等于a为止。

具体的实现步骤如下:

1. 读取输入的a和N。
2. 对于每个输入的数x,进行以下操作:
* 如果x大于等于a,则输出"lucky"。
* 否则,对x进行+1操作,直到x大于等于a为止,输出此时的x。

由于题目中没有明确给出幸运化的次数上限,因此在实现时需要注意避免陷入死循环。可以通过设置一个较大的上限值来避免这种情况,例如将上限值设置为1000000。

另外,由于题目中保证a≤1000001,因此在实现时可以直接使用一个数组来存储所有的完全平方数,以便快速判断一个数是否是幸运数。具体实现时,可以预先计算所有小于等于sqrt(1000001)的完全平方数,并将它们存储在一个数组中。对于每个输入的数x,可以在数组中进行二分查找,判断x是否是幸运数。

需要注意的是,题目中要求输出非幸运数幸运化后的结果,因此在实现时需要注意判断x是否是幸运数,如果是,则直接输出"lucky",否则输出幸运化后的结果。

27、烹饪问题

时间限制:1.0 s

内存限制:128.0 MB

问题描述

有N种食材,编号从0至N-1,其中第i种食材的美味度为ai

不同食材之间的组合可能产生奇妙的化学反应。具体来说,如果两种食材的美味度分别为x和y,那么它们的契合度为x and y。

其中,and运算为按位与运算,需要先将两个运算数转换为二进制,然后在高位补足0,再逐位进行与运算。例如,12与6的二进制表示分别为 1100 和 0110 ,将它们逐位进行与运算,得到 0100 ,转换为十进制得到4,因此12 and 6=4。在 C++ 或 Python 中,可以直接使用 & 运算符表示与运算。

现在,请你找到契合度最高的两种食材,并输出它们的契合度。

输入描述

第一行一个整数N,表示食材的种数。

接下来一行N个用空格隔开的整数,依次为a0,…,aN-1,表示各种食材的美味度。

输出描述

输出一行一个整数,表示最高的契合度。

特别提醒

在常规程序中,输入、输出时提供提示是好习惯。但在本场考试中,由于系统限定,请不要在输入、输出中附带任何提示信息。


样例输入 1

3
1 2 3

样例输出 1

2

样例解释 1

可以编号为1,2的食材之间的契合度为2 and 3=2,是所有食材两两之间最高的契合度。


样例输入 2

5
5 6 2 10 13

样例输出 2

8

样例解释 1

可以编号为3,4的食材之间的契合度为10 and 13=8,是所有食材两两之间最高的契合度。


数据规模

对于40%的测试点,保证N≤1000;

对于所有测试点,保证N≤106,0≤ai≤2147483647。

参考答案:```cpp#include #include #include using namespace std;int main() int N;cin >> N;vector a(N);for (int i = 0; i < N; i++) {cin >> a[i];}int max_and = 0;for (int i = 0; i < N; i++) {for (int j = i + 1; j < N; j++) {int and_val = a[i] & a[j];max_and = max(max_and, and_val);}}cout << max_and << endl;return 0;```

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

本题要求找到契合度最高的两种食材,并输出它们的契合度。契合度的计算方法是按位与运算。对于每对食材,我们可以直接计算它们的契合度,然后找到其中最大的值。

代码中使用一个vector存储食材的美味度,然后通过两层循环遍历所有食材的组合,计算它们的契合度,并更新最大值。最后输出最大值即可。

需要注意的是,由于食材的数量可能很大,两层循环的时间复杂度为O(N^2),可能会超时。在实际应用中,可能需要使用更高效的算法来解决问题。例如,可以使用位运算的性质,将食材的美味度转换为二进制形式,然后统计每个二进制位上1的个数,从而快速计算出所有食材组合中契合度的最大值。

本题的时间限制为1.0s,内存限制为128.0MB,因此需要注意算法的时间复杂度和空间复杂度,避免超时或超出内存限制。

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

创作类型:
原创

本文链接:2023年12月CCF-GESP编程能力等级认证Python编程五级真题答案及解析

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