第十二届蓝桥杯大赛模拟赛(第四期)python实现

1. 问题描述

ASCII 码将每个字符对应到一个数值(编码),用于信息的表示和传输。在 ASCII 码中,英文字母是按从小到大的顺序依次编码的,例如:字母 A 编码是 65, 字母 B 编码是 66,字母 C 编码是 67,请编码为 80 的是哪个字母?
答案

P

2.问题描述

请问在 1900 到 2020 中,有多少个质数。

用最简单的遍历做就行
答案

16

3 问题描述

有一棵二叉树,有2021个叶结点。
  请问。这棵树至少有多少个结点?

答案:

4021

4.问题描述

Fibonacci序列按照如下公式定义:
  F[1] = 1
  F[2] = 1
  F[i] = F[i-1] + F[i-2] (i>2)
  前几个 Fibonacci 数为 1, 1, 2, 3, 5, 8, 13, 21。
  请问,前100个 Fibonacci 数中,有多少个数是 3 的倍数?
答案提交
  这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
代码:

import math
sumvalue = 0
dp = [0 for i in range(200)]
dp[1],dp[2]=1,1
sumvalue=0
for i in range(3,101):
    dp[i] = dp[i-1]+dp[i-2]
    if(dp[i]%3==0):
        sumvalue+=1
print(sumvalue)

其实也可以通过规律得到,因为能够index整除4的数就能整除3
答案:

25

5.问题描述

一个身份证号码有 18 位数字或字母组成。其中前17位必须是数字,最后一位可能是数字或字母X。
  身份证号码满足一定的校验规则。
  令身份证号从右到左依次标号为 1 到 18,其中标号为 i 的位的位权设置为 2^(i-1) mod 11 (2的i-1次方除以 11 的余数)。
  将每一位的数值乘以位权后相加,得到的结果除以 11 的余数应当为 1。其中最后一位(标号为1)中如果出现字母 X,看成数字 10。
  例如,如果一个人的身份证号为 34052419800101001X,则:
  标号为 1 的位,位权 1,数值 X,即 10,相乘得 10。
  标号为 2 的位,位权 2,数值 1,相乘得 10。
  标号为 3 的位,位权 4,数值 0,相乘得 0。
  标号为 4 的位,位权 8,数值 0,相乘得 0。

计算器也可以做出来的题,大家可以试下,下面的代码可以算出1~17位的加权和为2,于是答案就是X

代码

str1 = input()
print(len(str1))
dp = [0 for i in range(30)]
for i in range(18):
    dp[i] = (2 ** (i)) % 11

sumvalue = 0
for i in range(18):
    alpha = str1[17 - i]
    if (alpha == 'X'):
        quan = 10
    else:
        quan = int(alpha) - int('0')
    sumvalue += (quan * dp[i])
print(sumvalue % 11)

可以将110101202102219990输入进去,得到是4,因为最后一位位权是1,所以最后一位是8的话4+8%11=1
答案:

8

6问题描述

小蓝在商店买文具。
  一支钢笔 x 元,小蓝买了 a 支。
  一个笔记本 y 元,小蓝买了 b 本。
  请问,小蓝一共需要支付多少钱?
输入格式
  输入四行。
  第一行包含一个整数 x。
  第二行包含一个整数 a。
  第三行包含一个整数 y。
  第四行包含一个整数 b。
输出格式
  输出一个整数,表示答案。

样例输入
5
2
1
6
样例输出
16
样例输入
2
0
2
1
样例输出
2

数据规模和约定
  对于所有评测用例,0 <= x, a, y, b <= 100。

x = int(input())
a = int(input())
y = int(input())
b = int(input())
print(a*x+y*b)

7.问题描述

给定一个单词,请将这个单词的首字母大写,后面的所有字母小写。
输入格式
  输入一行包含一个字符串,表示给定的单词。
输出格式
  输出变换后的单词。

样例输入
hello
样例输出
Hello
样例输入
WORLD
样例输出
World
样例输入
LanQiao
样例输出
Lanqiao

数据规模和约定
  对于所有评测用例,单词的长度不超过 100,单词中只包含大小写英文字母。

简单题,不多说

str1 = input()

str1=str1.lower()
str1=list(str1)
str1[0]=chr(ord(str1[0])+(ord('A')-ord('a')))
print("".join(str1))

8.问题描述

小Hi正在研究一种特殊的栈。这种栈的元素既可以从栈顶出栈,也可以从栈底出栈。(进栈还是只能从栈顶进栈)
  已知入栈的序列是1~N的一个排列,请你判断出栈序列能否是1, 2, 3, … N?

输入格式
  输入包含多组数据。
  输入第一行包含一个整数T,代表测试数据的组数。
  以下每组数据占据2行。
  第一行包含一个整数N。
  第二行包含N个整数,整数中由空格隔开。表示入栈序列。
输出格式
  对于每组数据输出YES或者NO,代表出栈序列能否是1, 2, 3, … N。
样例输入

2
5
2 4 1 3 5
5
4 3 1 5 2

样例输出

YES
NO

数据规模和约定
  对于30%的评测用例,1 <= N <= 10
  对于80%的评测用例,1 <= N <= 10000
  对于所有评测用例,1 <= N <= 100000, 1 <= T <= 10。
  
不敢相信自己这题用模拟做出来了,可能有些错误,但是思路应该是对的,欢迎大家改错
代码:

n = int(input())
while(n>0):
    m=int(input())
    stack=list(map(int,input().split()))
    stack=stack[::-1] #倒过来
    now =[]
    current=1
    flag=0  #flag作为标记为
    while(current<=m):
        if(len(stack)<=0):
            flag=1
            break
        if(len(now)==0):
            now.append(stack.pop())
        while(now[-1]!=current and now[0]!=current):
            now.append(stack.pop())
        if(now[-1]==current):
            now.pop(-1)
        elif(now[0]==current):
            now.pop(0)
        current+=1
        print(current)
    if(flag==1):
        print("NO")
    else:
        print("YES")
    n-=1

9.问题描述

给定一个序列 S = (s[1], s[2], …, s[n]),一个位置 p 上的变化度是指以这个位置为中心的相邻的 5 个元素的最大值与最小值的差,即 s[p-2], s[p-1], s[p], s[p+1], s[p+2] 中最大值与最小值的差。
  一个序列总共有 n-4 个变化度,位置 1, 2, n-1, n 没有变化度。
  例如,对于下面的序列 (1, 0, 4, 8, 5, 7, 6),总共有 3, 4, 5 三个位置有变化度,分别为 8, 8, 4。
  给定一个序列,请求出这个序列的变化度。
输入格式
  输入的第一行包含一个整数 n,表示给定的序列长度。
  第二行包含 n 个整数 s[1], s[2], …, s[n],表示给定的序列。
输出格式
  输出一行,包含 n-4 个非负整数,分别表示每个位置的变化度。
样例输入

7
1 0 4 8 5 7 6

样例输出

8 8 4

数据规模和约定
  对于所有评测用例,5 <= n <= 1000,0 <= s[i] <= 1000000。

这道题一开始以为得用前缀和什么的,但是一看数据范围,时间复杂度也就1000*5 狂喜,发现暴力就能做出来,就直接暴力了
代码:

n = int(input())
list1 = list(map(int,input().split()))
for i in range(2,len(list1)-2):
    minvalue = float('inf')
    maxvalue = - float('inf')
    for j in range(i-2,i+3):
        maxvalue =max(list1[j],maxvalue)
        minvalue =min(list1[j],minvalue)
    print(maxvalue-minvalue,end=" ")

10.问题描述

给定两个序列 A=(a_1, a_2, …, a_n) 和 B=(b_1, b_2, …, b_m), 它们的一个公共子序列是指从两个序列中分别取出相同个数的元素,按照原来的顺序排列后,对应位置的数值相等。
  例如,对于序列 A=(3, 2, 7, 6, 7) 和 B=(2, 3, 5, 7),可以在序列 A 中取出第 2, 3 个元素,在序列 B 中取出第 1, 4 个元素,值都是 2, 7,因此 2, 7 是一个公共子序列,在 A 中取第 2, 3 个元素和在 B 中取 1, 4 个元素是这个公共子序列的一种取法。
  在这两个序列中,有 4 中取法可以取出长度为 2 的公共子序列,例如
  1. 在 A 中取第 1, 3 个元素,在 B 中取 2, 4 个元素;
  1. 在 A 中取第 1, 5 个元素,在 B 中取 2, 4 个元素;
  1. 在 A 中取第 2, 3 个元素,在 B 中取 1, 4 个元素;
  1. 在 A 中取第 2, 5 个元素,在 B 中取 1, 4 个元素。
  给定两个序列,请问有多少种取法可以取出长度为 k 的公共子序列。
输入格式
  输入第一行包含三个整数 n, m, k,分别表示序列 A 的长度、序列 B 的长度和公共子序列的长度。
  第二行包含 n 个整数 a_1, a_2, …, a_n,表示给定的 A 序列。
  第三行包含 m 个整数 b_1, b_2, …, b_m,表示给定的 B 序列。
输出格式
  输出一行,包含一个整数,表示长度为 k 的公共子序列的数量,答案可能很大,请输出答案除以 1000007 的余数。

样例输入
5 4 2
3 2 7 6 7
2 3 5 7
样例输出
4

数据规模和约定
  对于 30% 的评测用例,1 <= n, m <= 20。
  对于 50% 的评测用例,1 <= n, m <= 100。
  对于所有评测用例,1 <= n, m <= 1000, 1 <= k <= 10, 0 <= a_i <= 100。

这道题暂时不想到什么好的解法,感觉想kmp算法能做出来,但是感觉又不能用,

你可能感兴趣的:(蓝桥杯,学习,python,数据结构)