2023年12月GESP Python五级编程题真题解析

2023-12-24 16:28

本文主要是介绍2023年12月GESP Python五级编程题真题解析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

【五级编程题1】

【试题名称】:小杨的幸运数
问题描述】

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

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

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

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

输入描述】

第一行2个正整数a, N

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

输出描述】

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

【数据规模】

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

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

对于所有测试点,保证a≤1,000,001;保证N≤2×10⁵;保证1≤x≤1,000,001

分析】

方法一

x>=a,判是否是完全平方数或完全平方数的倍数,输出“lukey”。如 int(x⁰·⁵)= x⁰·⁵ 则为完全平方数,在Pythonx**0.5//1int(x**0.5)3倍左右;x不是完全平方数,则完全平方数的倍数个数不超过x⁰·⁵,如是整数倍数,则求商是否是完全平方数?

对小于a或不是完全平方数或倍数的,则需要加1至大于等于a,直到是完全平方数或完全平方数的倍数,输出该数。

搜索2个完全平方数的次数不超过2001(2001*2001-2000*2000),找完全平方数倍数不超过x⁰·⁵

时间复杂度:O(n(x⁰·⁵+2001))2×10⁵×(1001+2001)6.1×10⁸,应该不会超时。

完整代码】
a, n = [int(i) for i in input().split()]               # 输入a和n
def p_square(n):                                       # 判完全平方数或其倍数if n**0.5 == n**0.5//1:return Trueelse:for i in range(2,int(x**0.5)+1):               # 倍数不超过int(x**0.5)if x // i == x / i and (x//i)**0.5 == (x//i)**0.5//1:return Trueelse:return False
for i in range(n):                                     # 循环输入并处理n个数x = int(input())                                   # 输入xtf = Falseif x >= a:if p_square(x):                                # 如果是完全平方数或其倍数print('lucky')                             # 输出lucky tf = Trueif not tf:                                         # 如果是则需要加1while True:x += 1if x >= a:if p_square(x):                        # 直到是完全平方数或其倍数print(x)                           # 输出该数break

运行结果】

方法二

先建完全平方数和其倍数表(简称lucky),将可能的数值范围内的完全平方数和其倍数纳入表中,如直接从表的x位置(索引)中找到的数=x,则输出“lucky”,否则输出该数。

因为题目给出a1,000,001N2×10⁵x1,000,001,所以最大的完全平方数不超过1001*1001,故先生成1001*1001+1元素为0的列表,在1~1001的平方大于等于a的位置填上平方数(lucky),并在其倍数位置填上相应倍数值(lucky)。对于0值用后面与其最接近的lucky数填充。输了直接用x作为索引查询,如x作为索引的值是x,则alucky数,输出“lucky”,否则输出x作为索引的值。

时间复杂度:小于O(4x),主要用于建表,1001×1001+1001×2001+2×10⁵<3.3×10⁶

完整代码】

a, n = [int(i) for i in input().split()]         # 输入a和n
max_ly = 1001 * 1001                             # 最大的lucky数不超过此数,x≤1000001
nr_ly = [0 for i in range(max_ly + 1)]           # 生成max_ly+1个元素为0的列表
for i in range(1, int(max_ly**0.5)+1):if i*i >= a:                                 # 大于等于a的完全平方数元素位置填入此数nr_ly[i*i] = i*ifor j in range(i*i + i*i, max_ly, i*i):  # 其倍数元素位置也填入其倍数nr_ly[j] = j
for i in range(max_ly, 0, -1):                   # 两个lucky数之间最近的lucky数是后面的数if not nr_ly[i]:                             # 如i是lucky数则有值,否则为0nr_ly[i] = nr_ly[i + 1]                  # 0值则填入其后面的数(最接近的lucky数)
for i in range(n):                               # 输入n个xx = int(input())                             # 输入xif nr_ly[x] == x:                            # 如果x是lucky数输出“lucky”print("lucky")else:print(nr_ly[x])                          # 否则输出最接近的lucky数(即x+1至lucky数)

运行结果】

【五级编程题2】

【试题名称】烹饪问题
问题描述】

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

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

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

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

输入描述】

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

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

【输出描述】

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

【数据规模】

40%的测试点保证N≤1,000

对所有测试点保证N≤10⁶0≤ai≤2,147,483,647(2³¹-1)

分析】

方法一

由于0≤ai≤2,147,483,647,所以(ai & aj)ij0,因此结果最大值的初值可定义为0。因为ai & aj = aj & ai,先取第1个与其它N-1个数进行按位与运算,如大于结果就赋给结果(求两数按位与的最大值),再取第2个与其后N-2个数进行按位与运算,如大于结果就赋给结果(求两数按位与的最大值),以此类推,直到所有数据都计算并比较大小。此解法时间复杂度为O(N²),可以解决40%多的数据,当N10⁴就可能超时。

【完整代码】
n = int(input())                                  # 输入n
a = [int(i) for i in input().split()]             # 输入n个食材的美味度
ans = 0                                           # 初值为0
for i in range(n-1):                              # 0≤i<n-1for j in range(i+1,n):                        # i+1≤j<nif a[i] & a[j] > ans:                     # a的下标为1~n-1ans = a[i] & a[j]                     # ans为两种食材的美味度的最大值
print(ans)                                        # 输出结果

运行结果】

方法二

因为ai≤2,147,483,647(2³¹-1),最多31位二进制,从最高位开始枚举,时间复杂度O(31N),可以解决所有数据,不超时。

【完整代码】

n = int(input())                                      # 输入n
a = [int(i) for i in input().split()]                 # 输入n个食材的美味度
ans = 0
for i in range(30,-1,-1):                             # 从最高位开始枚举ans += 2**i                                       # 加上当前二进制位为1cnt = 0                                           # 统计数量for j in range(n):                                # 遍历所有数if (ans & a[j] == ans):cnt += 1if cnt < 2:                                       # 两个以下ans -= 2**i                                   # 这一位为0(原加1,现减去1)
print(ans)                                            # 输出结果

运行结果】

这篇关于2023年12月GESP Python五级编程题真题解析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/532388

相关文章

Java中Redisson 的原理深度解析

《Java中Redisson的原理深度解析》Redisson是一个高性能的Redis客户端,它通过将Redis数据结构映射为Java对象和分布式对象,实现了在Java应用中方便地使用Redis,本文... 目录前言一、核心设计理念二、核心架构与通信层1. 基于 Netty 的异步非阻塞通信2. 编解码器三、

Java HashMap的底层实现原理深度解析

《JavaHashMap的底层实现原理深度解析》HashMap基于数组+链表+红黑树结构,通过哈希算法和扩容机制优化性能,负载因子与树化阈值平衡效率,是Java开发必备的高效数据结构,本文给大家介绍... 目录一、概述:HashMap的宏观结构二、核心数据结构解析1. 数组(桶数组)2. 链表节点(Node

Java AOP面向切面编程的概念和实现方式

《JavaAOP面向切面编程的概念和实现方式》AOP是面向切面编程,通过动态代理将横切关注点(如日志、事务)与核心业务逻辑分离,提升代码复用性和可维护性,本文给大家介绍JavaAOP面向切面编程的概... 目录一、AOP 是什么?二、AOP 的核心概念与实现方式核心概念实现方式三、Spring AOP 的关

Java 虚拟线程的创建与使用深度解析

《Java虚拟线程的创建与使用深度解析》虚拟线程是Java19中以预览特性形式引入,Java21起正式发布的轻量级线程,本文给大家介绍Java虚拟线程的创建与使用,感兴趣的朋友一起看看吧... 目录一、虚拟线程简介1.1 什么是虚拟线程?1.2 为什么需要虚拟线程?二、虚拟线程与平台线程对比代码对比示例:三

Python版本信息获取方法详解与实战

《Python版本信息获取方法详解与实战》在Python开发中,获取Python版本号是调试、兼容性检查和版本控制的重要基础操作,本文详细介绍了如何使用sys和platform模块获取Python的主... 目录1. python版本号获取基础2. 使用sys模块获取版本信息2.1 sys模块概述2.1.1

一文解析C#中的StringSplitOptions枚举

《一文解析C#中的StringSplitOptions枚举》StringSplitOptions是C#中的一个枚举类型,用于控制string.Split()方法分割字符串时的行为,核心作用是处理分割后... 目录C#的StringSplitOptions枚举1.StringSplitOptions枚举的常用

一文详解Python如何开发游戏

《一文详解Python如何开发游戏》Python是一种非常流行的编程语言,也可以用来开发游戏模组,:本文主要介绍Python如何开发游戏的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录一、python简介二、Python 开发 2D 游戏的优劣势优势缺点三、Python 开发 3D

Python函数作用域与闭包举例深度解析

《Python函数作用域与闭包举例深度解析》Python函数的作用域规则和闭包是编程中的关键概念,它们决定了变量的访问和生命周期,:本文主要介绍Python函数作用域与闭包的相关资料,文中通过代码... 目录1. 基础作用域访问示例1:访问全局变量示例2:访问外层函数变量2. 闭包基础示例3:简单闭包示例4

Python实现字典转字符串的五种方法

《Python实现字典转字符串的五种方法》本文介绍了在Python中如何将字典数据结构转换为字符串格式的多种方法,首先可以通过内置的str()函数进行简单转换;其次利用ison.dumps()函数能够... 目录1、使用json模块的dumps方法:2、使用str方法:3、使用循环和字符串拼接:4、使用字符

Python版本与package版本兼容性检查方法总结

《Python版本与package版本兼容性检查方法总结》:本文主要介绍Python版本与package版本兼容性检查方法的相关资料,文中提供四种检查方法,分别是pip查询、conda管理、PyP... 目录引言为什么会出现兼容性问题方法一:用 pip 官方命令查询可用版本方法二:conda 管理包环境方法