蓝桥杯练习题(四):Python组之历届试题三十题

文章目录

    • 1.小数第n位
    • 2.Excel地址
    • 3.对局匹配
    • 4.k倍区间
    • 5.小朋友排队
    • 6.单词分析
    • 7.成绩分析
    • 8.成绩统计
    • 9.回文日期
    • 10.数字三角形
    • 11.回文数字
    • 12.日期问题

1.小数第n位

  • 问题描述:我们知道,整数做除法时,有时得到有限小数,有时得到无限循环小数。如果我们把有限小数的末尾加上无限多个0,它们就有了统一的形式.本题的任务是:在上面的约定下,求整数除法小数点后的第n位开始的3位数。
  • 输入格式:一行三个整数:a b n,用空格分开。a是被除数,b是除数,n是所求的小数后位置(0
  • 输出格式:一行3位数字,表示:a除以b,小数后第n位开始的3位数字。
  • 样例输入:1 8 1
  • 样例输出:125
  • 样例输入:1 8 3
  • 样例输出:500
  • 样例输入:282866 999000 6
  • 样例输出:914

具体代码)

# 与>>类似“<< 左移” 左移一位表示乘2,二位就表示4,就是2的n次方 “>> 右移,高位补符号位” 这里右移一位表示除2“>>> 无符号右移,高位补0”;
def quickmi(a,n):
    res=1
    while n:
        if n%2!=0:
            res*=a%mod
        a*=a%mod
        n>>=1
    return res%mod

a, b, n = map(int, input().split())
mod=b*1000
c=a/b
# print(c)
c=int(c*quickmi(10,n+2))
x=c%1000
print(x)

运行结果:
蓝桥杯练习题(四):Python组之历届试题三十题_第1张图片

2.Excel地址

  • 问题描述:Excel单元格的地址表示很有趣,它使用字母来表示列号。
      比如,
      A表示第1列,
      B表示第2列,
      Z表示第26列,
      AA表示第27列,
      AB表示第28列,
      BA表示第53列,
      …
      当然Excel的最大列号是有限度的,所以转换起来不难。
      如果我们想把这种表示法一般化,可以把很大的数字转换为很长的字母序列呢?
      本题目即是要求对输入的数字, 输出其对应的Excel地址表示方式。
  • 样例输入:26
  • 样例输出:Z
  • 样例输入:27
  • 样例输出:AA
  • 样例输入:2054
  • 样例输出:BZZ

具体代码)

n=int(input())
a=[]
while n:
    if n%26==0:
        a.append(26)
        n=n//26-1
    else:
        a.append(n%26)
        n=n//26
for i in range(len(a)):
    print(chr(a[len(a)-1-i]+64),end='')

运行结果:
蓝桥杯练习题(四):Python组之历届试题三十题_第2张图片

3.对局匹配

  • 问题描述:小明喜欢在一个围棋网站上找别人在线对弈。这个网站上所有注册用户都有一个积分,代表他的围棋水平。
      小明发现网站的自动对局系统在匹配对手时,只会将积分差恰好是K的两名用户匹配在一起。如果两人分差小于或大于K,系统都不会将他们匹配。
      现在小明知道这个网站总共有N名用户,以及他们的积分分别是A1, A2, … AN。
      小明想了解最多可能有多少名用户同时在线寻找对手,但是系统却一场对局都匹配不起来(任意两名用户积分差不等于K)?
  • 输入格式 :第一行包含两个个整数N和K。   第二行包含N个整数A1, A2, … AN,对于30%的数据,1 <= N <= 10   对于100%的数据,1 <= N <= 100000, 0 <= Ai <= 100000, 0 <= K <= 100000
  • 输出格式 :一个整数,代表答案。
  • 样例输入:
    10 0
    1 4 2 8 5 7 1 4 2 8
  • 样例输出:6

具体代码)

n,m=list(map(int,input().split()))
arr=list(map(int,input().split()))
cout=0
for i in range(0,len(arr)):
    for j in range(i+1,len(arr)):
        if arr[i]-arr[j]==m:
            cout+=1
        else:
            continue
# print(arr)
print(n-cout)

运行结果:
蓝桥杯练习题(四):Python组之历届试题三十题_第3张图片

4.k倍区间

  • 问题描述:给定一个长度为N的数列,A1, A2, … AN,如果其中一段连续的子序列Ai, Ai+1, … Aj(i <= j)之和是K的倍数,我们就称这个区间[i, j]是K倍区间。
      你能求出数列中总共有多少个K倍区间吗?
  • 输入格式 :第一行包含两个整数N和K。(1 <= N, K <= 100000)以下N行每行包含一个整数Ai。(1 <= Ai <= 100000)
  • 输出格式 :输出一个整数,代表K倍区间的数目。
  • 样例输入:
    5 2
    1
    2
    3
    4
    5
  • 样例输出:6

具体代码:(但是只通过两个,28分)


n,m=list(map(int,input().split()))
a=[]
b=[0]
cout=0
for i in range(n):
    a.append(int(input()))
    b.append(sum(a))
# print(a)
# print(b)
for i in range(1,n+1):
    for j in range(i,n+1):
        if (b[j]-b[i-1])%m==0:
            cout+=1
print(cout)

运行结果:
蓝桥杯练习题(四):Python组之历届试题三十题_第4张图片

5.小朋友排队

  • 问题描述:n 个小朋友站成一排。现在要把他们按身高从低到高的顺序排列,但是每次只能交换位置相邻的两个小朋友。
      每个小朋友都有一个不高兴的程度。开始的时候,所有小朋友的不高兴程度都是0。
      如果某个小朋友第一次被要求交换,则他的不高兴程度增加1,如果第二次要求他交换,则他的不高兴程度增加2(即不高兴程度为3),依次类推。当要求某个小朋友第k次交换时,他的不高兴程度增加k。
      请问,要让所有小朋友按从低到高排队,他们的不高兴程度之和最小是多少。
      如果有两个小朋友身高一样,则他们谁站在谁前面是没有关系的。
  • 输入格式 :输入的第一行包含一个整数n,表示小朋友的个数。第二行包含 n 个整数 H1 H2 … Hn,分别表示每个小朋友的身高。
  • 输出格式 :输出一行,包含一个整数,表示小朋友的不高兴程度和的最小值。
  • 样例输入:
    3
    3 2 1
  • 样例输出:9

具体代码:(但是只通过两个,其它的全部超时,只有20分)

  • 解题思想:先创建一个3行N列的矩阵,第一行就是输入的我们输入的数,第二行是根据输入的数的个数创建相同个数的0,用来表示每个小朋友不高兴程度的累积,一开始为0,第三行就是与n相同个数的1,用来表示他们一开始不高兴程度的增加的初始值,后面随着两两交换,这两个数对应的第三行各自加到第二行,并且第三行自动加1,表示下一次当前小朋友移动的话会多一个值增加,并且这两个小朋友所在的第一行第二行第三行也要互相交换位置,最后我们得到的第二行就是每个小朋友的不高兴程度的值,通过迭代加起来即可,但是这种解法虽然可以通过,却只有两个正确得到20分,其它的全部超时,说明思路是没问题的,代码还需要改进。

def m_swap(a,b):
    t=int(b)
    b=int(a)
    a=t
    return a,b

def change(list):
    result = []
    for i in range(n):
        result.append(re_list[0][i])
    return result
    
n=int(input())
arr=list(map(int,input().split()))
arr_i=arr[:]
arr_i.sort()
arr1=[0 for i in range(n)]
arr2=[1 for i in range(n)]
list=arr+arr1+arr2
re_list=[arr,arr1,arr2]
# for i in re_list:
#     for j in range(n):
#         print(i[j],end=' ')
#     print()
# print('****************************begin**********************************')
for k in re_list:
    for j in range(0,n-1):
        if k==re_list[0]:
            if k[j]>k[j+1]:
                re_list[1][j]+=re_list[2][j]
                re_list[1][j+1]+=re_list[2][j+1]
                re_list[2][j]+=1
                re_list[2][j+1]+=1
                re_list[0][j],re_list[0][j+1]=m_swap(int(re_list[0][j]),int(re_list[0][j+1]))
                re_list[1][j], re_list[1][j + 1] =m_swap(int(re_list[1][j]),int(re_list[1][j + 1]))
                re_list[2][j], re_list[2][j + 1] =m_swap(int(re_list[2][j]),int(re_list[2][j + 1]))
                # 每次换位置之后数组显示
                # for i in re_list:
                #     for j in range(n):
                #         print(i[j], end=' ')
                #     print()
                # print("****************************************************************")
                result=change(re_list[0])
                # print(result)
                while result!=arr_i:
                    for k in re_list:
                        for j in range(0, n - 1):
                            if k == re_list[0]:
                                if k[j] > k[j + 1]:
                                    re_list[1][j] += re_list[2][j]
                                    re_list[1][j + 1] += re_list[2][j + 1]
                                    re_list[2][j] += 1
                                    re_list[2][j + 1] += 1
                                    re_list[0][j], re_list[0][j + 1] = m_swap(int(re_list[0][j]),
                                                                              int(re_list[0][j + 1]))
                                    re_list[1][j], re_list[1][j + 1] = m_swap(int(re_list[1][j]),
                                                                              int(re_list[1][j + 1]))
                                    re_list[2][j], re_list[2][j + 1] = m_swap(int(re_list[2][j]),
                                                                              int(re_list[2][j + 1]))
                                    # 每次换位置之后数组显示
                                    # for i in re_list:
                                    #     for j in range(n):
                                    #         print(i[j], end=' ')
                                    #     print()
                                    # print("****************************************************************")
                                    result = change(re_list[0])
sum=0
for i in range(n):
    sum+=re_list[1][i]
print(sum)



运行结果:
蓝桥杯练习题(四):Python组之历届试题三十题_第5张图片

6.单词分析

  • 问题描述:小蓝正在学习一门神奇的语言,这门语言中的单词都是由小写英文字母组成,有些单词很长,远远超过正常英文单词的长度。小蓝学了很长时间也记不住一些单词,他准备不再完全记忆这些单词,而是根据单词中哪个字母出现得最多来分辨单词。

现在,请你帮助小蓝,给了一个单词后,帮助他找到出现最多的字母和这个字母出现的次数。

  • 输入格式 :输入一行包含一个单词,单词只由小写英文字母组成。
  • 输出格式 :输出两行,第一行包含一个英文字母,表示单词中出现得最多的字母是哪个。如果有多个字母出现的次数相等,输出字典序最小的那个。

第二行包含一个整数,表示出现得最多的那个字母在单词中出现的次数。

  • 样例输入:lanqiao
  • 样例输出:
    a
    2

具体代码:

from collections import Counter
n=input()
arr=[]
for i in range(len(n)):
    arr.append(n[i])
# print(arr)
a=Counter(arr)
# print(a)
b=a.most_common(3)
# print(b)
for i in range(len(b)-1):
    if b[i][1]==b[i+1][1]:
        if b[i][0]>b[i+1][0]:
            print(b[i+1][0])
            print(b[i+1][1])
            break
    else:
        # print(b[i][0])
        # print(b[i][1])
        print(a.most_common(1)[0][0])
        print(a.most_common(1)[0][1])
        break

运行结果
蓝桥杯练习题(四):Python组之历届试题三十题_第6张图片

7.成绩分析

  • 问题描述:
    小蓝给学生们组织了一场考试,卷面总分为 100分,每个学生的得分都是一个 0到100的整数。请计算这次考试的最高分、最低分和平均分。
  • 输入格式 :输入的第一行包含一个整数 ,表示考试人数。
    接下来 n行,每行包含一个 0至100的整数,表示一个学生的得分。
  • 输出格式 :
    输出三行。
    第一行包含一个整数,表示最高分。
    第二行包含一个整数,表示最低分。
    第三行包含一个实数,四舍五入保留正好两位小数,表示平均分。
  • 样例输入:
    7
    80
    92
    56
    74
    88
    99
    10
  • 样例输出:
    99
    10
    71.29

具体代码:

def avg(list,sum):
    return sum/len(list)
n=int(input())
arr=[]
for i in range(n):
    arr.append(int(input()))
# print(arr)
sum=sum(arr)
print(max(arr))
print(min(arr))
print('%.2f'%avg(arr,sum))

运行结果
蓝桥杯练习题(四):Python组之历届试题三十题_第7张图片

8.成绩统计

  • 问题描述:
    小蓝给学生们组织了一场考试,卷面总分为100分,每个学生的得分都是一个0到100的整数。
    如果得分至少是60分,则称为及格。如果得分至少为85分,则称为优秀。
    请计算及格率和优秀率,用百分数表示,百分号前的部分四舍五入保留整数。
  • 输入格式 :输入的第一行包含一个整数 ,n表示考试人数。
    接下来 n行,每行包含一个0至100的整数,表示一个学生的得分。
  • 输出格式 :输出两行,每行一个百分数,分别表示及格率和优秀率。百分号前的部分四舍五入保留整数。
  • 样例输入:
    7
    80
    92
    56
    74
    88
    100
    0
  • 样例输出:
    71%
    43%

具体代码:

def cout(arr):
    sum_excellent=0
    sum_fail=0
    for i in range(n):
        if arr[i]<60 :
            sum_fail+=1
        if arr[i]>=85:
            sum_excellent+=1
    return sum_fail,sum_excellent

if __name__ == '__main__':
    import math
    n=int(input())
    arr=[]
    for i in range(n):
        arr.append(int(input()))
    a,b=cout(arr)
    # print(int((1-a/n)*100),'%',sep='')
    # print(int((b/n)*100),'%',sep='')
    # Math.floor(x) // 返回小于x的最大整数 Math.ceil(x) // 返回大于x的最小整数 Math.round()   返回四舍五入后的整数
    print('{}%'.format(round((1-a/n)*100)))
    print('{}%'.format(round((b/n) * 100)))

运行结果
蓝桥杯练习题(四):Python组之历届试题三十题_第8张图片

9.回文日期

  • 问题描述:

  • 输入格式
    在这里插入图片描述

  • 输出格式 :在这里插入图片描述

  • 样例输入:20200202

  • 样例输出:
    20211202
    21211212

具体代码:

def is_hui(x):
    x=str(x)
    if x==x[::-1]:
        return True
    else:
        return False
def is_run(x):
    if (x%4==0 and x%100!=0) or x%400==0:
        return True
    else:
        return False
def is_AB(x):
    x=str(x)
    if (x[0]==x[2]==x[5]==x[7]) and (x[1]==x[3]==x[4]==x[6]):
        return True
    else:
        return False

n=input()
year=int(n[0:4])
month=int(n[4:6])
day=int(n[6:])
# print(year,month,day)
i=1
flag=True
result=[]
result1=[]
while flag:
    day+=1
    if day==32 and month==12: # 年份+1的情况
        month=1
        day=1
        year+=1
        # print(year,month,day)
    if (day==32 and (month==1 or month==3 or month==5 or month==7 or month==8 or month==10)): # 奇数月+1的情况
        day=1
        month+=1
    if (day==31 and (month==4 or month==6 or month==9 or month==11)): # 偶数月+1的情况
        day=1
        month+=1
    if (day==30 and month==2 and is_run(year)): # 是闰年2月的情况
        day=1
        month+=1
    if (day==29 and month==2 and is_run(year)!=True): # 不是闰年2月的情况
        day=1
        month+=1
    # if month==0:
    #     month+=1
    num=year*10000+month*100+day
    if is_hui(num):
        result.append(num)
        if is_AB(num):
            result1.append(num)
            break

    # print(i)
# print(result)
print(result[0])
print(result1[0])

运行结果:
蓝桥杯练习题(四):Python组之历届试题三十题_第9张图片

10.数字三角形

  • 问题描述:
    蓝桥杯练习题(四):Python组之历届试题三十题_第10张图片

  • 输入格式
    在这里插入图片描述

  • 输出格式 :输出一个整数,表示答案。

  • 样例输入:
    5
    7
    3 8
    8 1 0
    2 7 4 4
    4 5 2 6 5

  • 样例输出:27

具体代码:

def DigitalTriangle():
    import copy
    n = int(input())
    arrs=[]
    for i in range(n):
        arrs.append(list(map(int,input().split())))

    temp_list = copy.deepcopy(arrs)  # 这里的temp_list实际存储的是左下和右下路径长度
    # print(temp_list)
    for i in range(1, n):
        for j in range(i):
            # print(i,'****',j)
            temp_list[i][j]=max(temp_list[i-1][j],temp_list[i-1][j-1])+arrs[i][j]
            #print(temp_list)
    if n%2==1:
        print(temp_list[n-1][int(n/2)])
    else:
        if temp_list[n-1][n//2] > temp_list[n-1][n//2-1]:
            print(temp_list[n-1][n//2])
        else:
            print(temp_list[n - 1][n // 2]-1)


DigitalTriangle()

运行结果:
蓝桥杯练习题(四):Python组之历届试题三十题_第11张图片

11.回文数字

  • 问题描述:
    在这里插入图片描述
  • 输入格式在这里插入图片描述
  • 输出格式 :蓝桥杯练习题(四):Python组之历届试题三十题_第12张图片
  • 样例输入:44
  • 样例输出:
    99899
    499994
    589985
    598895
    679976
    688886
    697796
    769967
    778877
    787787
    796697
    859958
    868868
    877778
    886688
    895598
    949949
    958859
    967769
    976679
    985589
    994499

具体代码:

def is_hui(x):
    x=str(x)
    if x==x[::-1]:
        return True
    else:
        return False
def sum_hui(x):
    x=str(x)
    sum=0
    for i in range(len(x)):
        sum+=int(x[i])
        # print(sum)
    return sum
n=int(input())
if n>54: # t通过上面的sum可以看到最大的n为54
    print(-1)
else:
    for i in range(10000,1000000):
        if is_hui(i):
            if sum_hui(i)==n:
                print(i)

运行结果:
蓝桥杯练习题(四):Python组之历届试题三十题_第13张图片

12.日期问题

  • 问题描述:蓝桥杯练习题(四):Python组之历届试题三十题_第14张图片
  • 输入格式 :一个日期,格式是"AA/BB/CC"。 (0 <= A, B, C <= 9)
  • 输出格式 :输出若干个不相同的日期,每个日期一行,格式是"yyyy-MM-dd"。多个日期按从早到晚排列。
  • 样例输入:02/03/04
  • 样例输出:
    2002-03-04
    2004-02-03
    2004-03-02

具体代码:

def is_run(x):
    if (x%4==0 and x%100!=0) or x%400==0:
        return True
    else:
        return False
def default(x,y,z):
    # 这些日期都在1960年1月1日至2059年12月31日。
    if x>=0 and x<=59:
        x+=2000
    elif x>=60 and x<=99:
        x+=1900
    # 月份小于0或者大于12的排除
    if y<=0 or y>12:
        return False
    # 天数小于0或者大于31的排除
    if z<=0 or z>31:
        return False
    if is_run(x) and y==2 and z>29: # 闰年2月为29天
        return False
    if is_run(x)==False and y==2 and z>28: # 闰年2月为28天
        return False
    if (y==4 or y==6 or y==9 or y==11) and z>30:
        return False
    if (y==1 or y==3 or y==5 or y==7 or y==8 or y==12) and z>31:
        return False
    else:
        if y<10:
            y=str(0)+str(y)
        if z<10:
            z=str(0)+str(z)
        arr.append(str(x) + '-' + str(y) + '-' + str(z))
        return


n=input()
year=int(n[0:2])
month=int(n[3:5])
day=int(n[6:9])


arr=[]
x11,y11,z11=0,0,0
x21,y21,z21=0,0,0
x31,y31,z31=0,0,0
if year==4:
    default(year,month,day)
    default(day,month,year)
    default(day,year,month)

    # set 有去重复的功能
    """
    aa = [1,2,2,3,3,2,7,8,9]
    print(len(set(aa)))
    """
    for i in range(len(set(arr))):
        print(arr[i])
else:
    default(day, month, year)
    default(year, month, day)
    default(day, year, month)
    for i in range(len(set(arr))):
        print(arr[i])

运行结果:
蓝桥杯练习题(四):Python组之历届试题三十题_第15张图片

你可能感兴趣的:(#,刷题总结,python,蓝桥杯,历年真题)