python蓝桥杯B组考前冲刺

Posted 风逸尘_lz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python蓝桥杯B组考前冲刺相关的知识,希望对你有一定的参考价值。

文章目录

平面切分


🏅传送通道

初始平面数为1
平面中每添加一条直线,平面数+1
新添加的直线与已有的直线的交点个数为N, 平面数再+N
每增加一条直线增加一个平面,每增加一个交点也增加一个平面😁

def isintersect(k1,b1,k2,b2): #判断两条直线是否相交
    if k1!=k2:
        return True
    else:
        return False
def getpoint(k1,b1,k2,b2):
    #计算两条直线的交点
    x=(b2-b1)/(k1-k2)
    y=(k2*b1-k1*b2)/(k2-k1)
    return (x,y)
#def isin(x0,y0,k,b):
 #   #判断某点是否在某条直线上
  #  if y0==k*x0+b:
   #     return True
    #else:
     #   return False
N=int(input())
li=[list(map(int,input().split())) for i in range(N)]
exist=[] #记录平面中已经有的直线
res=1 #记录平面的个数,初始为1
for item in li:
    points=[] #记录新添加的直线和已有直线的交点
    if item in exist: #如果已经有这条直线就直接跳过
        continue
    for e in exist: #遍历已有直线
        if isintersect(item[0],item[1],e[0],e[1]):
            #如果新添加的直线和已有的直线相交
            #计算它们的交点并记录
            new=getpoint(item[0],item[1],e[0],e[1])
            if new not in points:
                points.append(new)
    res+=(len(points)+1)
    exist.append(item)
print(res)

路径


定义函数求最小公倍数:

两个数:a和b(lcm函数)
axb=最大公约数x最小公倍数
最大公约数的求法:(辗转消除法)
其实在math库中有math.lcm(a,b)求最小公倍数,但是在蓝桥杯会报错没有。

dp[i] #i:结点编号1~2021 #dp[i]:当前结点到结点1的最短路径长度
dp[j] #j:结点编号i+1~i+21 #dp[j]:当前结点到结点i的最短路径长度

def lcm(a,b):
    s=a*b
    while b:
        a,b=b,a%b
    return s//a
n=2021
dp=[float('inf')]*(n+1)
dp[1]=0
for i in range(1,n+1):
    for j in range(i+1,i+22):
        if j>n:
            break
        dp[j]=min(dp[j],dp[i]+lcm(i,j))
print(dp[n])

数字三角形



左右向下走的次数只差不超过1,也就以为着只能取中间,如果是奇数直接取中间值,如果是偶数行,则取中间较大值。

n=int(input())
a=[list(map(int,input().split())) for i in range(n)]
for i in range(1,n):
    for j in range(i+1):
        if j==0:  #最左边元素只能由右上方得到
            a[i][j]+=a[i-1][j]
        elif j==i:  #最右边元素只能由左上方得到
            a[i][j]+=a[i-1][j-1] 
        else:
            a[i][j]+=max(a[i-1][j-1],a[i-1][j]) #中间元素取上方相邻两个最大值
if n%2: #奇数行,返回中间值
    print(a[-1][n//2])
else:
    print(max(a[-1][n//2-1],a[-1][n//2]))
"""
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
输出:27
"""

蛇形填数


可以建立一个空间直角坐标系,发现,坐标相加为奇数向左下方走,相加为偶数右上方走。

i,j,num=0,0,0 #初始化坐标和计数器
while True:
    num+=1
    if i==19 and j==19:
        break
    if (i+j)%2: #如果是奇数
        i+=1
        if j>0:
            j-=1
    else:
        j+=1
        if i>0:
            i-=1
print(num) #761

进制转换

一、其他进制转十进制:

2进制转10进制:

>>> int('1100',2)
12

8进制转10进制:

>>> int('12',8)
10

16进制转10进制:

>>> int('F',16)
15

二、十进制转其他进制

1.方式一:
bin()
oct()
hex()

>>> bin(2) #10进制转2进制
'0b10'
>>> oct(9) #10进制转8进制
'0o11'
>>> oct(15)
'0o17'
>>> hex(15) #10进制转16进制
'0xf'

format实现转换

>>> format(2,"b") # (10进制的)2转二进制
'10'
>>> format(9,"o") # (10进制的)9转八进制
'11'
>>> format(15,'x')
'f'

format(integer, ‘x’) 将integer转换为16进制,不带0x。integer为整型,‘x’可换为’o’,‘b’,'d’相对应八、二、十进制。
那么如何将2进制转换为16进制了,在纸上我们可以通过每次取四位作为一位,将2进制转16进制,也就是说1111 0000 (2)=F0(16),在python中,我们可以用int(‘11110000’,2)转10进制,再用10进制转16进制

>>> format(int('11110000',2),'x')
'f0'

一、Itertools.permutations

知识准备:
Python Itertools.Permutations()用法及代码示例 - 纯净天空 (vimsky.com)

1.马虎算式

from itertools import permutations
p=permutations(range(1,10),5)
num=0
for i in list(p):
  a,b,c,d,e=i
  if (a*10+b)*(c*100+d*10+e)==(a*100+d*10+b)*(c*10+e):
    num+=1
print(num)

方式二:

from itertools import permutations
count = 0
for i in permutations('123456789', 5):
    x = int(''.join(i[:2]))
    y = int(''.join(i[2:]))
    m = int(i[0]+i[3]+i[1])
    n = int(i[2]+i[4])
    if x*y == m*n:
      count += 1
print(count)

2.幻方


from itertools import permutations
for i in permutations([2,3,4,5,6,7,8,10,12,14]):
  if 16+i[0]+i[1]+13==i[2]+i[3]+i[4]+11==9+i[5]+i[6]+i[7]==i[8]+15+i[9]+1==16+i[2]+i[8]+9==i[0]+i[3]+i[5]+15==i[1]+11+i[6]+i[9]==13+i[4]+i[7]+1:
    print(i[7])
    break

二、itertools.combinations

combinations和permutations返回的是对象地址,原因是在python3里面,返回值已经不再是list,而是iterators(迭代器), 所以想要使用,只用将iterator 转换成list 即可。
combinations方法重点在组合

combinations(p,r) p是一个list参数 r是数字,r长度的tuple,按顺序排列,没有重复元素

3.数字划分

from itertools import *
li=list(range(1,17))
sum1=sum(li)
sum2=sum([pow(i,2) for i in li])
sum3=sum([pow(i,3) for i in li])
for x in combinations(li,8):
  lx = list(x)
  if sum(lx)==sum1//2 and sum([i*i for i in lx])==sum2//2 and sum([i*i*i for i in lx])==sum3//2 and 1 in lx:
    for j in lx:
      print(j,end=' ')

一、datetime模块

datetime模块

  1. isoweekday(…):
    返回符合ISO标准的指定日期所在的星期数(周一为1…周日为7)
    示例如下:
>>> a = datetime.date(2017,3,22)
>>> a.isoweekday()
3

2.timedelta()
timedelta类是用来计算二个datetime对象的差值的。
此类中包含如下属性:
1、days:天数
2、microseconds:微秒数(>=0 并且 <1秒)
3、seconds:秒数(>=0 并且 <1天)

1.星期一

from datetime import *
num=0
start=date(1901,1,1)
end=date(2000,12,31)
while start<=end:
  if start.weekday()==0:
    num+=1
  start+=timedelta(days=1)
print(num)

2.星系炸弹

from datetime import *
# start=date(2014,11,9)
# start+=timedelta(days=1000)
# print(format(start))
print(format(date(2014,11,9)+timedelta(days=1000)))

二、calendar模块

calendar详解

常用:

1.isleap(year):判断是否为闰年:

import calendar
print(calendar.isleap(2023)) #2023年是平年,返回False
print(calendar.isleap(2024)) #2024年是润年,返回True

2.leapdays(y1,y2):返回y1和y2之间的闰年数量:(包含起始年,不包含结束年

import calendar
print(calendar.leapdays(2000,2024))

3.weekday(year,month,day):获取指定日期为星期几

import calendar
print(calendar.weekday(2023,3,27)) # 0   是指星期一

4.monthrange(year,month):返回一个由一个月第一天的星期当前月的天数组成的元组

import calendar
print(calendar.monthrange(2023,3)) #返回(2,31) 表示2023年3月的第一天为星期三,这个月有31天

1.天数

import calendar
m=int(input())
print(calendar.monthrange(2021,m)[1])

单词分析

1.单词分析

word=input()
Max=0   
#找出数目最大的字母
for s in word:
  if word.count(s)>Max:
    Max=word.count(s)
#找出所有为Max数目的字母
New=[]
for s in word:
  if word.count(s)==Max:
    New.append(s)
New.sort()
print(New[0])
print(Max)

解法2:

a=input()
dicts=
for i in a:
    dicts[i]=dicts.get(i,0)+1
l = sorted(dicts.items(), key= lambda x:[x[1],-ord(x[0])])
print(l[-1][0])
print(l[-1][1])
成绩统计 - 蓝桥云课 (lanqiao.cn)
n=int(input())
a=[int(input()) for i in range(n)]
def f(x):
  return format(100*len([i for i in a if i>=x])/n,'.0f')+'%'
print(f(60),f(85),sep='\\n')

成绩统计

成绩统计

输入:
7
80
92
56
74
88
100
0
输出:
71%
43%
n=int(input())
a=[int(input()) for i in range(n)]
def f(x):
  return format(100*len([i for i in a if i>=x])/n,'.0f')+'%'
print(f(60),f(85),sep='\\n')

1.快速幂

1.1 快速幂


1.2 快速幂求逆元

蓝桥杯单片机组训练导航 

以下的资源完全免费,只求点赞收藏

有博主为13届蓝桥杯省赛而练习的题目:

蓝桥杯单片机历年省赛例程(第9届-第12届)-单片机文档类资源-CSDN文库

有博主整理的近几年的客观题的汇总,以及考前代码冲刺:

蓝桥杯单片机客观题汇总和赛前代码冲刺-单片机文档类资源-CSDN文库

有第13届的赛点资源包:

第13届蓝桥杯单片机组赛点资源包-单片机文档类资源-CSDN文库

有博主当时写的第12届单片机的程序分析,不过后来太懒了,就没有每一篇都更新了:
第十二届蓝桥杯单片机省赛程序设计总结

有博主今天刚比赛的总结和感悟,感兴趣的可以看看:
第13届蓝桥杯赛后总结

另外,博主这里说明一下:

国信长天的单片机组的训练板的硬件连接都是完全一样的,随便选择哪一款购买都可以。

文末分享一个公众号:撞上电子,里面关于蓝桥杯的资料比较多

以上是关于python蓝桥杯B组考前冲刺的主要内容,如果未能解决你的问题,请参考以下文章

蓝桥杯常犯的错误以及经验总结(考前冲刺必看)

蓝桥杯赛前冲刺-枚举暴力和排序专题2(包含历年蓝桥杯真题和AC代码)

蓝桥杯第26天(Python)考前挣扎

第九届蓝桥杯省赛B组 做题记录(python)

蓝桥杯题目难吗

蓝桥杯单片机组训练导航