前言
今天就让我们轰轰烈烈的回忆,好像毕业季!
明天就上考场了,大家准备的怎么样,相应的模块复习了吗,基础知识掌握了吗,我给一张官方出题范围,大家看看能不能自己写一张思维导图出来,文章结尾我会放一张自己做的思维导图供大家回忆过程。
下面是python2020年省赛题目,因为是第一届,还赶上庚子鼠年,纯纯赢麻了呀。
A:门牌制作
ans=0
for i in range(1,2021):
ans+=str(i).count('2')
print(ans)
秒杀题,秒杀题
B:寻找2020
比较经典的DFS,注意别超界,逐个方向判断就行
import os
import sys
N=300
data=[list(input()) for _ in range(N)]
row=len(data)
col=len(data[0])
res=0
for i in range(row):
for j in range(col):
if data[i][j]=='2':
if j<=col-4 and data[i][j+1]=='0' and data[i][j+2]=='2' and data[i][j+3]=='0':
res+=1
if i<=row-4 and data[i+1][j]=='0' and data[i+2][j]=='2' and data[i+3][j]=='0':
res+=1
if i<=row-4 and j<=col-4 and data[i+1][j+1]=='0' and data[i+2][j+2]=='2' and data[i+3][j+3]=='0':
res+=1
print(res)
C:跑步锻炼
import datetime
start=datetime.datetime(2000,1,1)
end=datetime.datetime(2020,10,1)
delta=datetime.timedelta(days=1)
ans=0
while start<=end:
if start.weekday()==0 or start.day==1:
ans+=2
else:
ans+=1
start+=delta
print(ans)
通篇背诵,通篇背诵,在Python里面日期题很简单,千万别丢分,delta代表差值,days是单位,datetime类型实例有day的属性代表这个月第几天,weekday()函数判断星期几(0-6)
官方文件看一眼,明天就得用了嘻嘻
D:蛇形填数
我记得这个是有规律的,拿笔推一推,借张网图吧
ans=1
for i in range(1,20):
ans+=i*4
print(ans)
E:排序
这个要找特殊情况
考虑冒泡排序的复杂度,N个字母最多需要交换N*(N-1)/2次(完全乱序时)
易知N=15时,有15*14/2=105,即满足100次交换所需的最短字符串有15个字母。
要求字典序最小,那么就取a~o这15个字典序最小的字母
逆向思考,目标字符串经过100次交换后,得到正序字符串abcdefghijklmno,而完全逆序的字符串onmlkjihgfedcba变成正序字符串需要105次交换,那么将完全逆序的字符串交换5次后,便能得到答案。因要求字典序最小,那么将j交换5次提到字符串最前面,就得到了最小的情况
F:成绩统计
白给的
n=int(input())
jg=0
yx=0
for i in range(n):
t=int(input())
if t>=60:
jg+=1
if t>=85:
yx+=1
print(round(jg/n*100),end="%")
print()
print(round(yx/n*100),end="%")
G:单词分析
s=input()
num=0
c=' '
for i in s:
if s.count(i)>num:
num=s.count(i)
c=i
print(c)
print(num)
别想太复杂,主打一个count
H:数字三角形
DP,有三个方向,最左边:左下角只能给右上角,最后边:右下角只能给左上角,中间就正常,输出时要遵循题目要求,方向偏移不能超出1,奇数行就是中间那个,偶数行是中间两者的比较
n=int(input())
arr=[list(map(int,input().split())) for _ in range(n)]
for i in range(1,n):
for j in range(i+1):
if j==0:
arr[i][j]+=arr[i-1][j]
elif j==i:
arr[i][j]+=arr[i-1][j-1]
else:
arr[i][j]+=max(arr[i-1][j-1],arr[i-1][j])
else:
if n%2==0:
print(max(arr[i][n//2-1],arr[i][n//2])
else:
print(arr[i][n//2])
I:平面切分
这题大家先仔细想想,一开始是一个平面,+一个直线就变成了两个,再加个直线就有两种情况
一个是它和第一条相交一个交点,把现在的两个平面分成了4个;另一个是他和第一条重叠或平行,总数+1
所以随便添加一个直线,最少添加一个,变量就是它和其他直线的交点数
n=eval(input())
line=[tuple(map(int,input().split(" "))) for i in range(n)]#用元组收集(k,b)
s=set(line)#去除重复的直线
line=list(s)
if line:
ans=2#如果有直线,那么至少两个平面
for i in range(1,len(line)):
a1,b1=line[i]
pos=set()#交点集合
for j in range(i):#取出当前直线前面的直线斜率进行比较
a2,b2=line[j]
if a1==a2:#平行或重合
continue
x=(b1-b2)/(a1-a2)
y=a1*x+b1
pos.add((x,y))#收集交点
ans+=len(pos)+1#交点数+1
print(ans)
J:装宝珠
这题咱就不看了
结语
呼~ 最后一套也刷完了,一身轻松,今晚睡个好觉,明天提前半小时去考场测试机器。
答应大家的思维导图还没做完,内容我在回忆之前的博客,可能要一段时间,我先放个大体结构在这里,想看的小伙伴可以评论区留言,制作完成后发给大家。