蓝桥杯青少组STEMA测评(2022年3月)Python编程题解


代码:

· 

· 

N = int(input())print("*"*N)

解说:Python字符串是序列,可以使用乘号(*)进行复制。

代码:

· 

· 

c = input()print(chr(ord(c)+ord('A')-ord('a')))

解说:ord转ASCII编码,加'A'和'a'的差,边长大写字母的ASCII编码,然后用chr转回字母。
代码:

· 

· 

· 

· 

· 

· 

· 

· 

· 

N = int(input())lst = list(map(int, input().split(',')))M = len(lst)count = 0for i in range(M-1):    for j in range(i+1,M):        if lst[i] + lst[j] == N:            count += 1print(count)

解说:map是转换序列全部元素的映射机制,上面程序中把输入字符串分割成序列后,使用这种机制映射每个元素到int函数转换;上面的双循环是标准的列表2元素组合——第一个range的参数是M-1,第二个range的参数是i+1和M。

分析:首先可以算出最后每个人的糖果数,然后考虑第一个人,有三种情况:多、等、少,多分给下一个,等直接跳到下一个(这一个也变成了下一轮的第一个),最后要解决的是少的问题。要从下一个拿,如果下一个的数量够补(可以为0),可以结束这一轮,进入下一轮,如果不够,就要递归直到够为止,然后进入下一轮(这个递归过程与允许数量为负数,结果是一样的)。代码:

· 

· 

· 

· 

· 

· 

· 

· 

· 

lst = list(map(int, input().split(',')))N = len(lst)M = sum(lst)//Ncount=0for idx in range(N-1):    if lst[idx] != M:        lst[idx+1] += lst[idx] - M        count += 1print(count)

输入样例:2,4,5,1,3
输出样例:2
经手工计算验证正确。

分析:这个问题实际是把字符串切为M+1段,每段转为数字后相乘,输入积的最大值。要解决的问题是M+1个非0有序整数,它们的和是字符串的长度。如果M是一个确定的数,那么可以用M重循环获得这些值,但M不是,只能用递归生成它们。
代码:

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

M = int(input())S = input()maxsum = 0  #最大值def camax(nums):  #计算一组的值    global maxsum    preIndex=0    ms = 1    for idx in nums:        ms *= int(S[preIndex:preIndex+idx])  #前下标加数量截止下标        preIndex += idx    ms *= int(S[preIndex])  #剩下的部分    if ms > maxsum:        maxsum=msdef create(nums,n):  #产生M个位置的递归函数    if len(nums) == M:  #第M个数不需要(0开始)        camax(nums)        return    for i in range(1,n):        ns = nums.copy()  #浅拷贝        ns.append(i)        create(ns,n-i)  #i最大是n-1create([],len(S))  #调用递归函数生成结果print(maxsum)