2022年第十三届蓝桥杯python组决赛

前言:

这次国赛还是比较难的,只有两道填空而且都是大量计算用时一个小时,第二道写完了但还最后还差10分组跑出结果心态崩了...不过最后两道大题还是较为容易ak的,可能是官方给个体面分吧

思路经供参考,在网上找了下没有几篇文章,填空题最终得到的结果也得不到验证就不写出了

目录

填空题

斐波那契与7

小蓝做实验

编程题

取模

内存空间

近似GCD

交通信号

点亮

打折

owo

替换字符



填空题


斐波那契与7

题目:

2022年第十三届蓝桥杯python组决赛_第1张图片

思路:

一开始看到这么多项就知道肯定是不能硬跑的,哪怕只取末尾运算也难以得到结果。然后就针对末尾项找规律。因为dp[n]的结果只与前两项有关,只要前两项的末位数的顺序之前出现过,那么这个区间就是重复区间。然后找到每隔60项为一周期,这里面有8个7

代码:

dp=[1 for _ in range(3)]
chucun=[[1,1]]
res=0
for i in range(70):
    dp[2]=dp[1]+dp[0]
    # 这里的项数实质从3开始
    print(i,dp[2])
    s=str(dp[2])
    if s[-1]=='7':
        res += 1
    s2,s3,s4=str(dp[2]),str(dp[1]),str(dp[0])
    if [s4,s3] in chucun:
        print(s4,s3)
        break
    else:
        chucun.append([s4,s3])
    #print(s4,s3)
    # 只取尾数,方便计算
    dp[1],dp[0]=int(s2[-1]),int(s3[-1])
print(res)

答案:


小蓝做实验

题目:

2022年第十三届蓝桥杯python组决赛_第2张图片

思路:

这题只能暴力跑了,不过能做一些优化

1.观察所有数据可以发现,位数都是1,3,5,7,9。位数为5的数字全部去掉,可以删去四分之一的数据

2.采用6的余数法,原理就不阐述了,结论是一个质数除余6,结果必然为1或者5

3.在2的基础上,遍历时可以再做两点优化,遍历最大值为根号下该数字,和步长为2,跳过所有偶数

只能想到这几点优化,不过最后跑起来还是要命,jupyter大概二十分钟出结果,但比赛时用官方给的编辑器跑了将近一小时还没,最后无奈放弃

代码:

def zhishu(num):
    if num%6!=1 and num%6!=5:
        return False
    for i in range(3,int(num**0.5)+1,2):
        if num%i==0:
            return False
    return True
nums=[]
res=0
with open('primes.txt') as fp:
    for line in fp.readlines():
        nums.append(list(line.strip()))
nums2=[]
# 删去尾数为5的数据
for i in range(len(nums)):
    nums[i]=''.join(nums[i])
    if str(nums[i])[-1]=='5':
        continue
    nums2.append(nums[i])
print(len(nums2))
for i in range(len(nums2)):
    print(i)
    if zhishu(int(nums2[i])):
        res += 1
print(res)

答案:


编程题


取模

题目:

2022年第十三届蓝桥杯python组决赛_第3张图片

思路:

没有捷径,直接算就好了

代码:

num=int(input())
for i in range(num):
    n,m=map(int,input().split())
    key=1
    for x in range(1,m):
        for y in range(x+1,m+1):
            if n%x==n%y:
                print('Yes')
                key=0
                break
        if key==0:
            break
    if key==1:
        print('No')

内存空间

题目:

小蓝最近总喜欢计算自己的代码中定义的变量占用了多少内存空间。
为了简化问题,变量的类型只有以下三种:
int:整型变量,一个int 型变量占用4 Byte 的内存空间。
long:长整型变量,一个long 型变量占用8 Byte 的内存空间。
String:字符串变量,占用空间和字符串长度有关,设字符串长度为L,
则字符串占用L Byte 的内存空间,如果字符串长度为0 则占用0 Byte 的内存
空间。
定义变量的语句只有两种形式,第一种形式为:
type var1=value1,var2=value2…;
定义了若干个type 类型变量var1、var2、…,并且用value1、value2
…初始化,
多个变量之间用’,’ 分隔,语句以’;’ 结尾,type 可能是int、long 或
String。例如int a=1,b=5,c=6; 占用空间为12 Byte;long a=1,b=5;
占用空间为16 Byte;String s1=””,s2=”hello”,s3=”world”; 占用空
间为10 Byte。
第二种形式为:
type[] arr1=new type[size1],arr2=new type[size2]…;
定义了若干type 类型的一维数组变量arr1、arr2…,且数组的大小为
size1、size2…,多个变量之间用’,’ 进行分隔,语句以’;’ 结尾,type 只可
能是int 或long。例如int[] a1=new int[10]; 占用的内存空间为40Byte;

long[] a1=new long[10],a2=new long[10]; 占用的内存空间为
160 Byte。
已知小蓝有T 条定义变量的语句,请你帮他统计下一共占用了多少内
存空间。结果的表示方式为:aGBbMBcKBdB,其中a、b、c、d 为统计的
结果,GB、MB、KB、B 为单位。优先用大的单位来表示,1GB=1024MB,
1MB=1024KB,1KB=1024B,其中B 表示Byte。如果a、b、c、d 中的某几个
数字为0,那么不必输出这几个数字及其单位。题目保证一行中只有一句定义
变量的语句,且每条语句都满足题干中描述的定义格式,所有的变量名都是合
法的且均不重复。题目中的数据很规整,和上述给出的例子类似,除了类型后
面有一个空格,以及定义数组时new 后面的一个空格之外,不会出现多余的空
格。

 【输入格式】
输入的第一行包含一个整数T ,表示有T 句变量定义的语句。
接下来T 行,每行包含一句变量定义语句。
【输出格式】
输出一行包含一个字符串,表示所有语句所占用空间的总大小。

【样例输入1】
1
long[] nums=new long[131072];
【样例输出1】
1MB


【样例输入2】
4
int a=0,b=0;
long x=0,y=0;
String s1=”hello”,s2=”world”;

long[] arr1=new long[100000],arr2=new long[100000];
【样例输出2】
1MB538KB546B

思路:

题目整整三页是真的长啊,因为两道填空浪费了大量时间,当时看到这道题果断放弃

ps(现在看到都头皮发麻不想写...读完题目后发现思路不难,但基础不好,不知道怎么读取变量...

代码:

##

近似GCD

时间限制: 10.0s 内存限制: 512.0MB 本题总分:15 分

题目:

小蓝有一个长度为n 的数组A = (a1; a2; ...; an),数组的子数组被定义为从
原数组中选出连续的一个或多个元素组成的数组。数组的最大公约数指的是数
组中所有元素的最大公约数。如果最多更改数组中的一个元素之后,数组的最
大公约数为g,那么称g 为这个数组的近似GCD。一个数组的近似GCD 可能
有多种取值。
具体的,判断g 是否为一个子数组的近似GCD 如下:
1. 如果这个子数组的最大公约数就是g,那么说明g 是其近似GCD。
2. 在修改这个子数组中的一个元素之后(可以改成想要的任何值),子数
组的最大公约数为g,那么说明g 是这个子数组的近似GCD。
小蓝想知道,数组A 有多少个长度大于等于2 的子数组满足近似GCD 的
值为g。


输入格式:

输入的第一行包含两个整数n; g,用一个空格分隔,分别表示数组A 的长
度和g 的值。
第二行包含n 个整数a1; a2; ... ; an,相邻两个整数之间用一个空格分隔。

输出格式:

输出一行包含一个整数表示数组A 有多少个长度大于等于2 的子数组的近
似GCD 的值为g 。

样例输入:

5 3
1 3 6 4 10

样例输出:

5

思路:

暴力吧,想了很久想不到更好的

最大公约数可以记住这个代码格式,比遍历快很多

代码:

def gongyue(x,y):
    a,b=x,y
    while b:
        a,b=b,a%b
    return a

n,g=map(int,input().split())
nums=list(map(int,input().split()))
res=0
i=0
while i

交通信号

时间限制: 10.0s 内存限制: 512.0MB 本题总分:15 分

题目:

LQ 市的交通系统可以看成由n 个结点和m 条有向边组成的有向图。在每
条边上有一个信号灯,会不断按绿黄红黄绿黄红黄... 的顺序循环(初始时刚好
变到绿灯)。当信号灯为绿灯时允许正向通行,红灯时允许反向通行,黄灯时不
允许通行。每条边上的信号灯的三种颜色的持续时长都互相独立,其中黄灯的
持续时长等同于走完路径的耗时。当走到一条边上时,需要观察边上的信号灯,
如果允许通行则可以通过此边,在通行过程中不再受信号灯的影响;否则需要
等待,直到允许通行。
请问从结点s 到结点t 所需的最短时间是多少,如果s 无法到达t 则输出
-1。


输入格式:

输入的第一行包含四个整数n;m; s; t,相邻两个整数之间用一个空格分隔。
接下来m 行,每行包含五个整数ui; vi; gi; ri; di ,相邻两个整数之间用一个
空格分隔,分别表示一条边的起点,终点,绿灯、红灯的持续时长和距离(黄
灯的持续时长)。

输出格式:

输出一行包含一个整数表示从结点s 到达t 所需的最短时间。

样例输入:

4 4 1 4
1 2 1 2 6
4 2 1 1 5
1 3 1 1 1
3 4 1 99 1

样例输出:

11

思路:

比赛时看了一眼题干就知道不容易,果然暴力都没思路...

代码:

##

点亮

时间限制: 10.0s 内存限制: 512.0MB 本题总分:20 分

题目:

小蓝最近迷上了一款名为《点亮》的谜题游戏,游戏在一个n n 的格子棋
盘上进行,棋盘由黑色和白色两种格子组成,玩家在白色格子上放置灯泡,确
保任意两个灯泡不会相互照射,直到整个棋盘上的白色格子都被点亮(每个谜
题均为唯一解)。灯泡只会往水平和垂直方向发射光线,照亮整行和整列,除非
它的光线被黑色格子挡住。黑色格子上可能有从0 到4 的整数数字,表示与其
上下左右四个相邻的白色格子共有几个灯泡;也可能没有数字,这表示可以在
上下左右四个相邻的白色格子处任意选择几个位置放置灯泡。游戏的目标是选
择合适的位置放置灯泡,使得整个棋盘上的白色格子都被照亮。
例如,有一个黑色格子处数字为4,这表示它周围必须有4 个灯泡,需要
在他的上、下、左、右处分别放置一个灯泡;如果一个黑色格子处数字为2,它
的上下左右相邻格子只有3 个格子是白色格子,那么需要从这三个白色格子中
选择两个来放置灯泡;如果一个黑色格子没有标记数字,且其上下左右相邻格
子全是白色格子,那么可以从这4 个白色格子中任选出0 至4 个来放置灯泡。
题目保证给出的数据是合法的,黑色格子周围一定有位置可以放下对应数
量的灯泡。且保证所有谜题的解都是唯一的。
现在,给出一个初始的棋盘局面,请在上面放置好灯泡,使得整个棋盘上
的白色格子被点亮。


输入格式:

输入的第一行包含一个整数n,表示棋盘的大小。
接下来n 行,每行包含n 个字符,表示给定的棋盘。字符. 表示对应的格
子为白色,数字字符0、1、2、3、4 表示一个有数字标识的黑色格子,大写字
母X 表示没有数字标识的黑色格子。

输出格式:

输出n 行,每行包含n 个字符,表示答案。大写字母O 表示对应的格子包
含灯泡,其它字符的意义与输入相同。

样例输入:

5
.....
.2.4.
..4..
.2.X.
.....

样例输出:

...O.
.2O4O
.O4O.
.2OX.
O....

思路:

代码:

##

打折

题目:

2022年第十三届蓝桥杯python组决赛_第4张图片


输入格式:

输入的第一行包含两个整数n;m,用一个空格分隔,分别表示物品的个数
和店铺的个数。
接下来依次包含每个店铺的描述。每个店铺由若干行组成,其中第一行包
含四个整数si; ti; pi; ci,相邻两个整数之间用一个空格分隔,分别表示商店优惠
的起始和结束时间、折扣率以及商店内的商品总数。之后接ci 行,每行包含两
个整数aj; bj ,用一个空格分隔,分别表示该商店的第j 个商品的类型和价格。
商品的类型由1 至n 编号。

输出格式:

输出一行包含一个整数表示小蓝需要花费的最少的钱数。

样例输入:

2 2
1 2 89 1

1 97
3 4 77 1
2 15

样例输出:

101

思路:

暴力,但太麻烦了比赛时来不及写,现在是不想写~

代码:

##

owo

题目:

小蓝很喜欢owo ,他现在有一些字符串,他想将这些字符串拼接起来,使
得最终得到的字符串中出现尽可能多的owo 。
在计算数量时,允许字符重叠,即owowo 计算为2 个,owowowo 计算为
3 个。
请算出最优情况下得到的字符串中有多少个owo。

输入格式:

输入的第一行包含一个整数n ,表示小蓝拥有的字符串的数量。
接下来n 行,每行包含一个由小写英文字母组成的字符串si 。

输出格式:

输出n 行,每行包含一个整数,表示前i 个字符串在最优拼接方案中可以
得到的owo 的数量。

样例输入:

3
owo
w
ow

样例输出:

1

1

2

思路:

这题感觉就是签到题,到现在位置读了无数遍题都没发现坑点,不就是计数+判断吗?

判断:取o和w个数最小的一个,如果w个数小则输出w的个数,否则输出o的个数-1

代码:

n=int(input())
o,w=0,0

for i in range(n):
    t1=input()
    for t2 in t1:
        if t2=='o':
            o += 1
        elif t2=='w':
            w += 1
    if o>w:
        print(w)
    else:
        print(max(0,w-1))

替换字符

时间限制: 10.0s 内存限制: 512.0MB 本题总分:25 分

题目:

给定一个仅含小写英文字母的字符串s,每次操作选择一个区间[li; ri] 将s
的该区间中的所有字母xi 全部替换成字母yi,问所有操作做完后,得到的字符
串是什么。


输入格式:

输入的第一行包含一个字符串s 。
第二行包含一个整数m 。
接下来m 行,每行包含4 个参数li; ri; xi; yi,相邻两个参数之间用一个空格
分隔,其中li; ri 为整数,xi; yi 为小写字母。

输出格式:

输出一行包含一个字符串表示答案。

样例输入:

abcaaea
41
7 c e
3 3 e b
3 6 b e
1 4 a c

样例输出:

cbecaea

思路:

没想到什么好办法,时间限时10s就直接按题意写吧

(最后两道题简单到让人无法相信...

代码:

s=input()
## 转数组
nums=[]
for i in s:
    nums.append(i)
m=int(input())
for i in range(m):
    l,r,x,y=map(str,input().split())
    l,r=int(l),int(r)
    for j in range(l-1,r):
        if nums[j]==x:
            nums[j]=y
res=''.join(nums)
print(res)

你可能感兴趣的:(大数据)