Advertisement

2020年第十一届蓝桥杯python组省赛

阅读量:

前言:

python最简单的一套题了,适合小白入门练手


目录

填空题

门牌制作

寻找 2020

跑步锻炼

蛇形填数

排序

编程大题

成绩统计

单词分析

数字三角形

平面切分

装饰珠


填空题


门牌制作

题目:

小蓝要为一条街的住户制作门牌号。
这条街一共有 2020 位住户,门牌号从 1 到 2020 编号。
小蓝制作门牌的方法是先制作 0 到 9 这几个数字字符,最后根据需要将字
符粘贴到门牌上,例如门牌 1017 需要依次粘贴字符 1、0、1、7,即需要 1 个 字符 0,2 个字符 1,1 个字符 7。
请问要制作所有的 1 到 2020 号门牌,总共需要多少个字符 2?

思路:

遍历一遍,记录2的个数

代码:

复制代码
 res=0

    
 for i in range(1,2021):
    
     str1=str(i)
    
     for j in str1:
    
     if j=='2':
    
         res += 1
    
 print(res)

答案:624


寻找 2020

题目:

小蓝有一个数字矩阵,里面只包含数字 0 和 2。小蓝很喜欢 2020,他想找
到这个数字矩阵中有多少个 2020 。
小蓝只关注三种构成 2020 的方式:

同一行里面连续四个字符从左到右构成 2020。
同一列里面连续四个字符从上到下构成 2020。
在一条从左上到右下的斜线上连续四个字符,从左上到右下构成 2020。
例如,对于下面的矩阵:
220000
000000
002202
000000
000022
002020
一共有 5 个 2020。其中 1 个是在同一行里的,1 个是在同一列里的,3 个 是斜线上的。
小蓝的矩阵比上面的矩阵要大,由于太大了,他只好将这个矩阵放在了一 个文件里面,在试题目录下有一个文件 2020.txt,里面给出了小蓝的矩阵。
请帮助小蓝确定在他的矩阵中有多少个 2020。

文件内容:

复制代码
    待补

思路:

矩阵不大,暴力解就好

代码:

复制代码
 nums=[]

    
 with open('2020.txt') as fp:
    
     for line in fp.readlines():
    
     nums.append(list(line.strip()))
    
 n,m=len(nums),len(nums[0])
    
 res=0
    
 ## 横
    
 for i in range(n):
    
     for j in range(m-3):
    
     t1=nums[i][j]+nums[i][j+1]+nums[i][j+2]+nums[i][j+3]
    
     if t1=='2020':
    
         res += 1
    
 ## 竖
    
 for i in range(n-3):
    
     for j in range(m):
    
     t2=nums[i][j]+nums[i+1][j]+nums[i+2][j]+nums[i+3][j]
    
     if t2=='2020':
    
         res += 1
    
 ## 斜
    
 for i in range(n-3):
    
     for j in range(m-3):
    
     t3=nums[i][j]+nums[i+1][j+1]+nums[i+2][j+2]+nums[i+3][j+3]
    
     if t3=='2020':
    
         res += 1
    
 print(res)

答案:16520


跑步锻炼

题目:

小蓝每天都锻炼身体。
正常情况下,小蓝每天跑 1 千米。
如果某天是周一或者月初(1 日),为了激励自己,小蓝要跑2千米。如果同时是周一或月初,小蓝也是跑2千米。
小蓝跑步已经坚持了很长时间,从2000年1月1日周六(含)到2020年10月1日周四(含)。
请问这段时间小蓝总共跑步多少千米?

思路:

1.excel大法

2.利用datetime库函数

代码:

复制代码
 import datetime

    
 star=datetime.date(2000,1,1)
    
 end=datetime.date(2020,10,1)
    
 t=datetime.timedelta(1)
    
 res=0
    
 while star<=end:
    
     if star.day==1 or star.weekday()==0:
    
     res += 2
    
     else:
    
     res += 1
    
     star += t
    
 print(res)

答案:8879


蛇形填数

题目:

如下图所示,小明用从1开始的正整数“蛇形”填充无限大的矩阵。
1 2 6 7 15 …
3 5 8 14 …
4 9 13 …
10 12 …
11 …

容易看出矩阵第二行第二列中的数是 5。请你计算矩阵中第 20 行第 20 列的数是多少?

思路:

1.把这个矩阵斜着看,其实就是一个金字塔,[[1],[3,2],[4,5,6]...]

前n-1行数字个数和+len(第n行)//2+1

代码:

复制代码
 dp=[1 for _ in range(20)]

    
 for i in range(1,len(dp)):
    
     dp[i]=dp[i-1]+4*i
    
 print(dp)

答案:761


排序

题目:

小蓝最近学习了一些排序算法,其中冒泡排序让他印象深刻。
在冒泡排序中,每次只能交换相邻的两个元素。
小蓝发现,如果对一个字符串中的字符排序,只允许交换相邻的两个字符,则在所有可能的排序方案中,冒泡排序的总交换次数是最少的。
例如,对于字符串 lan 排序,只需要 1 次交换。
对于字符串 qiao 排序,总共需要 4 次交换。
小蓝找到了很多字符串试图排序,他恰巧碰到一个字符串,需要 100 次交换,可是他忘了吧这个字符串记下来,现在找不到了。
请帮助小蓝找一个只包含小写英文字母且没有字母重复出现的字符串,对该串的字符排序,正好需要 100 次交换。
如果可能找到多个,请告诉小蓝最短的那个。
如果最短的仍然有多个,请告诉小蓝字典序最小的那个。

思路:

字符串最短,字典序最小。

1.找到即字母全部倒着的时候

a:0 ba:1+0 cba:2+1 dcba:3+3

规律:dp[i]=dp[i-1]+i 注:下标从0开始时

第15个数字时是105,此时是onmlkjihgfedcba

多五个,那就把第六个字母提到最前即可

(比如求4次交换,6次时是dcba,那4次就是b移到最前,b是第(6-4)+1个字母

代码:

复制代码
 dp=[0 for _ in range(20)]

    
 for i in range(1,len(dp)):
    
     dp[i]=dp[i-1]+i
    
 print(dp)
    
 print(len('nmlkjihgfedcba'))
    
 print('jonmlkihgfedcba')

答案:jonmlkihgfedcba


编程大题


成绩统计

题目:

小蓝给学生们组织了一场考试,卷面总分为100分,每个学生的得分都是一个0到100的整数。如果得分至少是 60分,则称为及格。如果得分至少为85分,则称为优秀。
请计算及格率和优秀率,用百分数表示,百分号前的部分四舍五入保留整数。


输入格式:

输入的第一行包含一个整数n,表示考试人数。接下来 n行,每行包含一个 0至 100的整数,表示一个学生的得分。

输出格式:

输出两行,每行一个百分数,分别表示及格率和优秀率。百分号前的部分四舍五入保留整数。

样例输入:

7
80
92
56
74
88
100
0

样例输出:

71%
43%

思路:

小学生数学题

代码:

复制代码
 n=int(input())

    
 nums=[]
    
 youxiu,jige=0,0
    
 for i in range(n):
    
     t1=int(input())
    
     if t1>=85:
    
     youxiu += 1
    
     jige += 1
    
     elif t1>=60:
    
     jige += 1
    
  
    
 res_jg=jige/n*100
    
 t2,t3=int(res_jg),int(res_jg)+1
    
 if res_jg>=(t2+t3)/2:
    
     print(str(t3)+'%')
    
 else:
    
     print(str(t2)+'%')
    
     
    
 res_yx=youxiu/n*100
    
 t2,t3=int(res_yx),int(res_yx)+1
    
 if res_yx>=(t2+t3)/2:
    
     print(str(t3)+'%')
    
 else:
    
     print(str(t2)+'%')

单词分析

题目:

小蓝正在学习一门神奇的语言,这门语言中的单词都是由小写英文字母组成,有些单词很长,远远超过正常英文单词的长度。小蓝学了很长时间也记不住一些单词,他准备不再完全记忆这些单词,而是根据单词中哪个字母出现得最多来分辨单词。
现在,请你帮助小蓝,给了一个单词后,帮助他找到出现最多的字母和这个字母出现的次数。


输入格式:

输入一行包含一个单词,单词只由小写英文字母组成。

输出格式:

输出两行,第一行包含一个英文字母,表示单词中出现得最多的字母是哪个。如果有多个字母出现的次数相等,输出字典序最小的那个。
第二行包含一个整数,表示出现得最多的那个字母在单词中出现的次数。

样例输入:

lanqiao

样例输出:

a

2

思路:

小学生数学题*2

代码:

复制代码
 s=str(input())

    
 str1=set()
    
 for i in s:
    
     str1.add(i)
    
 str1=list(str1)
    
 str1.sort()
    
 t1=0
    
 for i in str1:
    
     if s.count(i)>t1:
    
     t1=s.count(i)
    
     res=i
    
 print(res)
    
 print(t1)

数字三角形

题目:

上图给出了一个数字三角形。从三角形的顶部到底部有很多条不同的路径。对于每条路径,把路径上面的数加起来可以得到一个和,你的任务就是找到最大的和。
路径上的每一步只能从一个数走到下一层和它最近的左边的那个数或者右边的那个数。此外,向左下走的次数与向右下走的次数相差不能超过 1。


输入格式:

输入的第一行包含一个整数N(1<N≤100),表示三角形的行数。下面的 N行给出数字三角形。数字三角形上的数都是 0至 100之间的整数。

输出格式:

输出一个整数,表示答案。

样例输入:

5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5

样例输出:

27

思路:

小学....算了初中生题目稍微写一下吧

如果第n行是偶数,那就是max(dp[n][n//2-1],dp[n][n//2])

奇数:dp[n][n//2]

代码:

复制代码
 n=int(input())

    
 nums=[]
    
 for i in range(n):
    
     nums.append(list(map(int,input().split())))
    
 dp=[[0]*j for j in range(1,n+1)]
    
 dp[0][0]=nums[0][0]
    
 for i in range(1,n):
    
     for j in range(i+1):
    
     if j==0:
    
         dp[i][j]=dp[i-1][j]+nums[i][j]
    
     elif j==i:
    
         dp[i][j]=dp[i-1][j-1]+nums[i][j]
    
     else:
    
         dp[i][j]=max(dp[i-1][j-1],dp[i-1][j])+nums[i][j]
    
 if n%2==1:
    
     print(dp[-1][n//2]) 
    
 else:
    
     print(max(dp[-1][n//2-1],dp[-1][n//2]))

平面切分

题目:

平面上有N条直线,其中第 i 条直线是y=Ai⋅x+Bi。请计算这些直线将平面分成了几个部分。


输入格式:

第一行包含一个整数 N。以下N行,每行包含两个整数 Ai,Bi。

输出格式:

一个整数代表答案。

样例输入:

3
1 1
2 2
3 3

样例输出:

6

思路:

这次真是高中数学题了

记住一句话这道题就出来了(具体论证推理没有

每多一条线,假设他与之前的线有n个交点,则此时平面划分多n+1个

平行的时候也就是多一个

然后就是遍历每一条线与其他线的交点总数了

代码:

复制代码
 def jiaodian(l1,l2):

    
     a1,a2=l1[0],l2[0]
    
     b1,b2=l1[1],l2[1]
    
     if a1==a2:
    
     return False
    
     else:
    
     x=(b2-b1)/(a1-a2)
    
     y=a1*x+b1
    
     return [x,y]
    
     
    
 n=int(input())
    
 nums=set()
    
 for i in range(n):
    
     t1,t2=list(map(int,input().split()))
    
     nums.add(tuple([t1,t2]))
    
 nums=list(nums)
    
 ## 注意要更新n
    
 n=len(nums)
    
 res=n+1
    
 for i in range(n-1):
    
     point=set()
    
     for j in range(i+1,n):
    
     if not jiaodian(nums[i],nums[j]):
    
         continue
    
     else:
    
         t1=jiaodian(nums[i],nums[j])
    
         point.add(tuple(t1))
    
     res += len(point)
    
 print(res)

装饰珠

题目:

在怪物猎人这一款游戏中,玩家可以通过给装备镶嵌不同的装饰珠来获取相应的技能,以提升自己的战斗能力。

已知猎人身上一共有 6件装备,每件装备可能有若干个装饰孔,每个装饰孔有各自的等级,可以镶嵌一颗小于等于自身等级的装饰珠(也可以选择不镶嵌)。装饰珠有M种,编号1至M,分别对应M种技能,第i种装饰珠的等级为 Li,只能镶嵌在等级大于等于 Li的装饰孔中。

对第 i种技能来说,当装备相应技能的装饰珠数量达到 Ki个时,会产生 Wi(Ki)

的价值。镶嵌同类技能的数量越多,产生的价值越大,即 Wi(Ki−1)<Wi(Ki)。但每个技能都有上限 Pi(1≤Pi≤7),当装备的珠子数量超过 Pi时,只会产生 Wi(Pi)的价值。

对于给定的装备和装饰珠数据,求解如何镶嵌装饰珠,使得 6件装备能得到的总价值达到最大。


输入格式:

输入的第1至6行,包含6件装备的描述。其中第i的第一个整数Ni表示第i件装备的装饰孔数量。后面紧接着Ni个整数,分别表示该装备上每个装饰孔的等级 L(1≤L≤4)。第7行包含一个正整数M,表示装饰珠(技能)种类数量。第8至 M+7行,每行描述一种装饰珠(技能)的情况。每行的前两个整数 Lj(1≤Lj≤4)和 Pj(1≤Pj≤7)分别表示第j种装饰珠的等级和上限。接下来 Pj个整数,其中第 k个数表示装备该中装饰珠数量为 k时的价值 Wj(k)。

输出格式:

输出一行包含一个整数,表示能够得到的最大价值。

样例输入:

1 1
2 1 2
1 1
2 2 2
1 1
1 3
3
1 5 1 2 3 5 8
2 4 2 4 8 15
3 2 5 10

样例输出:

20

思路:

下午比赛了,现在不想动脑,回补

代码:

复制代码
    ##

全部评论 (0)

还没有任何评论哟~