0
点赞
收藏
分享

微信扫一扫

蓝桥杯第十三届省赛题目(4月23日)答案汇总 python

sullay 2022-05-06 阅读 63

目录

第一题:

思路:

代码:

第二题:

思路:

代码:

第三题:

思路:

代码:

第四题:

思路:

代码:

第五题:

思路:

代码:

第六题:

思路:

代码:


不知道题的看这里:第十三届蓝桥杯省赛python4月23日题目汇总_悦儿姐的博客-CSDN博客

第一题:

思路:

直接拼,十分简单

代码:

S1=input()
S2=input()
print(S1+S2)

温馨小提示:题目中给你什么变量,你在代码中就尽量用什么变量。

第二题:

思路:

很容易想到列表的一个非常nice的功能,max。你如果就爱玩那麻烦的,就排个序,再打印。

代码:

N=input()
a=[int(i) for i in N]  # 列表表达式 
print(max(a))

这里运用了一个列表表达式,可以省去不必要的麻烦。i代表列表里的各个元素 整个式子翻译过来就是:i在N里遍历,每次的i变成数字再在a列表里变成元素

第三题:

思路:

就是小学的加减运算,小青伸手高度是a(就是举个例子,在题里人家说的是N),竹竿长度是b,给的苹果高度c,求a+b大不大于c就好

代码:

N=int(input())
M=list(eval(input()))  # 万能公式
s=0
for i in M:
    if N+80 >= i:
        s+=1
print(s)

万能公式是指,如果你输入进来的是一个数字字符串,用英文逗号隔开,eval它,可以把它变成数字元组(逗号没了,一个个数字变成一个个元素),再list它,可以把它变成列表。

例如:输入:1,2,3,4,5 eval前:‘1,2,3,4,5’ eval后:(1,2,3,4,5) list后:[1,2,3,4,5]

第四题:

思路:

是一个递归的思路,观察可知,当N=1/2/3时,它们的方案分别为1、2、4,没有规律。但当N>=4时,N就等于所有它以前的方案数总和了,就特别像求一个数的阶乘,只不过稍稍有些变动。举个例子,当N=5,我们要求:(当N=4的方案数)+(当N=3的方案数)+(当N=2的方案数)+(当N=1的方案数),3、2、1的方案数我们知道,4的方案数还要在求一步:(当N=3的方案数)+(当N=2的方案数)+(当N=1的方案数),这样就能求出结果啦!

代码:

N = int(input())  # 输入一个数(代表物品数)
def f(N):  # 创建一个递归函数
    if N == 1:  # 当N等于1、2、3时,结果没有规律,所以直接返回结果
        return 1
    elif N == 2:
        return 2
    elif N == 3:
        return 4
    else:
        return f(N-1)+f(N-2)+f(N-3)  # 因为我们已知的有三个没规律的 所以要把这三个都包含
print(f(N))  # 最终打印结果

第五题:

思路:

可以采用一种“污海”的思路:找到一块海,在它的下面一直找,左面一直找,找到一个“污”一个(即把1变成0),这样便能找到全部的未被污染的海域还能既不重复也不遗漏了!有人说那右边的和上边的怎么办,那要怪你没考虑周全,你如果一块海在上边或右边有海,那么在遍历它上面或右边时不早把这块海遍历“污染”了吗?所以是方法可行的。

代码:

 
def find_left(j,g,s,M):  # 左边找找(M后期赋值 列的意思)
    d=0  # 纯净海域数
    while g<M-1:  # 注意不要超过遍历范围,M为了变成索引号要-1
        if s[j][g]==1:  # 判断是否没被污染
            s[j][g]=0  # 把海污染了
            g+=1  # 往左一块
            d+=1  # 纯净海域数+1
        else:
            break  # 不是就退出
    if d !=0:  # 如果有纯净海域(不管多少,有就行)
        return 1
    else:
        return 0
 
def find_down(j,g,s,N):  # 下面找找,和左边方法一模一样(N后期赋值 行的意思)
    d=0
    while j<N:
        if s[j][g]==1:
            s[j][g]=0
            j+=1  # 往下一块
            d+=1
        else:
            break
    if d !=0:
        return 1
    else:
        return 0
n=input()  # 输入行和列
N=int(n[0])  # 行
M=int(n[2])  # 列(去掉逗号 它算第三个)
s=[]  # 总体大地图
z=0  # 纯净海域数(未被加工 拐角处会算两个)
y=0  # 拐角数(把z减掉y就剩下最终结果了)
for i in range(N):  # 搞N个输入框 达到N行的效果
    a=list(eval(input()))  # 把输入结果转成列表
    s.append(a)  # 把a这个小地图放到s这个大地图里
for j in range(N):  # 行索引号
    for g in range(M):  # 列索引号
        if s[j][g]==1:  # 开始判断拐角
            if ((j<N-1 and s[j+1][g]==1) or (j>0 and s[j-1][g]==1)) and ((g<M-1 and s[j][g+1]==1) or (g>0 and s[j][g-1]==1)):  
#  既满足 下边有 或者 上边有 还满足 右边有 或者 左边有 
                y+=1  # 拐角数+1
 
for j in range(N):
    for g in range(M):
        l=find_left(j,g,s,M)  # 左找找
        e=find_down(j+1,g,s,N)  # 下找找
        if e !=0 or l!=0:  # 看看有没有
            z+=1  # 有 纯净海域数量就+1
print(z-y)  # 打印最终结果

第六题:

思路:

这题直接暴力解,一共可以分为几个大块,第一、输入,第二、对角线遍历(可以考虑用函数) 第三、判断矩形是否只有一条对角线   第四、输出

代码:

n=input()  # 输入行和列
N=int(n[0])  # 行就是第一个
M=int(n[2])  # 去掉空格来算,列是第三个
s=[]  # 创建一个列表,里面要装所有的格子
d=0  # 输出结果(最长奖品对角线)
for i in range(N):  # 搞N行的输入框
    c=input()[::2]  # 去掉空格
    c=[int(i) for i in c]  # 转成数字
    s.append(c)  # 装进大列表里
def find_left(i,j,s):  #  进行左对角线寻找 i是行数索引号,j是列数索引号
    global N  # 把N搞成全局变量,要用一下它
    h=1  # 对角线奖品数
    x=i  # 给i和j搞个备份
    y=j
    a=0  # 用来判断矩形是否只有一条对角线的东东
    if s[i][j] == 1:  # 看看第一个是不是有奖品
        while (j>0 and i<N-1)and s[i][j]==1 :
            '''
            循环,达到对角线遍历的效果。
            N要变成索引号得-1
            j要注意不要等于零(后面j-1时会超出遍历范围)。i同理。
             '''
            
            i+=1  # 往下一列
            j-=1  # 往左一格
            h+=1  # 对角线奖品数+1
        for t in range(h):  # 画(不是真的画!)出一个矩形
            a=0  # 每次得把a清零一下
            for r in range (h):
                if y<N-1:  # 小心,别又超出范围了(这种东西真的超烦)
 
                    a+=s[x][y-r]  # 每次往左
                    '''
                    把在画出的矩形的每一行都统计一下,
                    如果这个矩形里只有一条对角线,
                    那么每行都只会有一个1
                     '''
            x+=1  # 换行
            if a != 1:  # 判断一下
                return 0  # 如果有其他的1那么就踢掉
 
        return h  # 最终返回对角线奖品数量
            
    else:  # 如果第一个就没有奖品 就没有遍历的价值了
        return 0;  # 直接返回0
def find_right(i,j,s):  #  进行右对角线寻找 和左对角线寻找方法一模一样
    global N,M  # 这回M也要用用
    h=1
    x=i
    y=j
    a=0
    if s[i][j] == 1:
        while (i<N-1 and j < M-1) and s[i][j]==1 : # M-1的道理和N-1的一样
            i+=1
            j+=1  # 往右一格
            h+=1
        for t in range(h):
            a=0
            for r in range (h):
                if y< M-1 :
                    a+=s[x][y+r]  # 每次往右
            x+=1
            if a != 1:
                return 0
        return h
            
    else:
        return 0;
for i in range(N):  # i是行索引号
    for j in range(M):  # j是列索引号
        e=find_left(i,j,s)  # 左边找找
        f=find_right(i,j,s)  # 右边也找找
        d=e if e>d and e>f else f if f>d else d  # 这里运用了一个三目运算符
#  返回e 得满足e>d和e>f。要不就是f 得满足f>d(因为e已经小于f了 就不比了)。都不是返回d 
print(d)

文章到这里就结束啦,如果你做出来了一些题,跟我有不一样的意见,或者有好的代码,那就尽情发给我吧,评论私信都可以哈。最后发起一个小投票,有兴趣的投一下。

举报

相关推荐

0 条评论