我是靠谱客的博主 含糊高跟鞋,最近开发中收集的这篇文章主要介绍蓝桥杯--算法,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

在准备蓝桥杯时做的一些笔记在这里记录一下。
#选择排序算法

for x in range(n-1):
	for y in range(x+1,n):
		if s[x]<s[y]:
			s[x],s[y]=s[y],s[x]

#冒泡排序算法

for x in range(n-1):
	for y in range(n-1-x):
		if s[y]<s[y+1]:
			s[y],s[y+1]=s[y+1],s[y]

index()可以获取指定元素首次出现的下标

count()指定元素在列表中出现的次数

list.sort(reverse=True)降序排序

zip将多个列表或元组对应位置的元素组合为元组,返回列表

enumerate()返回枚举对象中每个元素包含下标和元素值的元组

list(zip(*matrix))矩阵转置bvfrom operator import itemgetter

hec()十进制转化为十六进制

oct()十进制转化为八进制

bin()十进制转化为二进制

把x保留到小数点后要求的位数

round(x,3)
print('%.3f'%x)
print('{:.3f}'.format(x))

map(function,iter)根据提供的函数对指定序列做映射。

sort()无返回值。sorted()返回一个新的list

1.列表转化为字符串

ls = [“1”,“2”,“3”]

“”.join(ls)

2.sep实现分隔符
3.字符串可以看作为可迭代对象

s = “abc”
for i in s:
print(i)

字符串是不可变对象

s = “abc”
temp = list(s)
temp[2] = “d”
s = “”.join(temp)
print(s)

或者

s = “abc”
s = s.replace(“c”,“d”)
print(s)

接收由空格分开的多个数据

ls = input().split()

同时改变列表中所有元素的类型

ls = input().split()
ls2 = list(map(int,ls))

基本操作

1、输入输出

#循环读取到文件末尾
try:
	while True:
        s=input()
except:
    pass

#读取n,m,再读取n个数,m行
n,m=(int(_) for _ in input().strip().split(" "))
a=[int(_) for _ in input().strip().split(" ")]
for i in range(m):
    s = input()

# 读取的第二种方法,map映射
a1 = list(map(int, input().split()))

# 输出n个数在一行(无行尾空格)
ans = [1, 2, 3, 4]
for j in ans[:-1]:
    print(j, end=" ")
print(ans[-1])

2、算法模板

(1)线性筛

N = int(1e6 + 5)
isPrime = [1 for _ in range(N)]
Prime = []


def getprime(n):
    isPrime[1] = 0
    for i in range(2, n + 1):
        if isPrime[i]:
            Prime.append(i)
        for j in Prime:
            if i * j > N:
                break
            isPrime[i * j] = 0
            if i % j == 0:
                break

(2)扩展欧几里得

def exgcd(a, b):
    if b == 0:
        return 1, 0, a
    x, y, g = exgcd(b, a % b)
    x, y = y, x - a // b * y
    return x, y, g


T = int(input())
for i in range(T):
    n, d, x, y = (int(x) for x in input().strip().split(' '))
    t1, t2, g = exgcd(n, d)
    if (y - x) % g:
        print("Impossible")
    else:
        t2 *= (y - x) // g
        n //= g
        print(t2 % n)

基础

**1.fibonacci数列
n=int(input())
f=[1 for i in range(n+1)]
k=3
while k<=n:
    f[k]=(f[k-1]+f[k-2])%10007
    k+=1
print(f[n])
2.圆的面积
import math
r=int(input())
area=math.pi*r*r
print('%.7f'%area)
3.序列求和

用等差数列公式,不要用循环,否则当数据规模变大会超时

n=int(input())
sum=n*(n+1)/2
print('%d'%sum)
4.A+B问题

a,b=map(int,input().split())

print(a+b)

5.数列排序

n=int(input())
arr=list(map(int,input().split()))
arr.sort()
for i in arr:
print(i,end=’ ')

6.进制之间的转换
将整数转换为二进制、八进制和十六进制

bin() oct() hex()

如果不带Ob,Oo或Ox前缀的话,用format()函数

format(x,‘b’) format(x,‘o’) format(x,‘x’)

int()函数用于将一个字符串或数字转换为整型
字符和ASCII码的转换

ord(‘A’) chr(65)

十六进制转八进制
n=int(input())
for i in range(n):
    a=input()
    a=format(int(a,16),'o')
    print(a)
十六进制转十进制
n=input()
print(int(n,16))
十进制转十六进制
n=input()
print(format(n,'x'))
7.特殊回文数
import time
def ispal(i):
    i=str(i)
    if i==i[::-1]:
        return True
    else:
        return False
def sums(i):
    i=str(i)
    s=0
    for j in range(len(i)):
        s+=int(i[j])
    return s
n=int(input())
i=10000
while i<1000000:
    if ispal(i):
        if sums(i)==n:
            print(i)
    i+=1

8.回文数
import time
def ispal(i):
    i=str(i)
    if i==i[::-1]:
        return True
    else:
        return False
i=1000
while i<10000:
    if ispal(i):
            print(i)
    i+=1
9.水仙花数
def iswater(i):
    a = i % 10 # 十位
    b = (i//10) % 10 # 百位 注意Python中除法一定会得到浮点数 要取整 而C中则不需要
    c = i//100
    if a**3+b**3+c**3==i:
        return True
    else:
        return False
i=100
while i<1000:
    if iswater(i):
        print(i)
    i+=1
10.杨辉三角
n=int(input())
yang=[]
for i in range(n):
    yang.append([0 for j in range(i+1)])
for i in range(n):
    yang[i][0]=yang[i][-1]=1

for i in range(n):
    for j in range(1,i):
        yang[i][j]=yang[i-1][j-1]+yang[i-1][j]
for i in range(n):
    for j in range(i+1):
        print(yang[i][j],end=' ')
    print()
11.查找整数
n=int(input())
lists=list(map(int,input().split()))
a=int(input())
flag=1
for i in lists:
    if i==a:
        print(lists.index(i)+1)
        flag==0
        break
    
if flag:
    print('-1')
12.数列特征
n=int(input())
lists=list(map(int,input().split()))
print(max(lists))
print(min(lists))
print(sum(lists))

python列表中的sort()函数对有负数的列表无法进行排序的

13.字母图形
n,m=map(int,input().split())
lists=[[0 for j in range(m)] for i in range(n)]
for i in range(n):
    for j in range(m):
        if j>i:
            lists[i][j]=chr(ord('A')+j-i)
        else:
            lists[i][j]=chr(ord('A')+i-j)

for i in range(n):
    for j in range(m):
        print(lists[i][j],end='')
    print()
14.字串01(在前面添加0)
for i in range(32):
    print("{0:0>5}".format(format(i,'b')))
15.闰年判断
year=int(input())
if (year%4==0 and year%100!=0)|(year%400==0):
    print('yes')
else:
    print('no')
16.阶乘计算
n=int(input())
a=s=1
while a<=n:
    s=s*a
    a+=1
print(s)
17.长整数加法

18.哈夫曼树

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NqcCdqwb-1650248123225)(C:UsersTianAppDataRoamingTyporatypora-user-imagesimage-20220402205218992.png)]

n=int(input())
lists=list(map(int,input().split()))
sum=0
while len(lists)!=1:
    min1=min(lists)
    lists.remove(min1)
    min2=min(lists)
    lists.remove(min2)
    min_sum=min1+min2
    sum+=min_sum
    lists.append(min_sum)
print(sum)
n=int(input())
lists=list(map(int,input().split()))
price=[0 for i in range(n-1)]
for i in range(n-1):
    lists.sort()
    value1=lists.pop(0)
    value2=lists.pop(0)
    price[i]=value1+value2
    lists.append(price[i])
print(sum(price))
19.2N 皇后问题
def queen(A, cur=0):  # cur表示当前行数下标,A储存每行有皇后的列的下标
   global count
   if cur == len(A):  # 溢出棋盘边界,跳出递归判断
       print(A)  # 打印位置
       count += 1  # 可能+1
       return 0  # 跳出本次递归
   for col in range(len(A)):  # col表示当前列下标,从第一行到最后一行遍历
       A[cur], flag = col, True  # 存储当前列下标,暂时判定可以放置皇后
       for row in range(cur):  # 遍历前cur行
           if A[row] == col or abs(col - A[row]) == cur - row:
               flag = False  # 不可以放置皇后
               break  # 跳出for循环
           if flag:  # 判断是否可以放置皇后
               queen(A, cur+1)  # 可以放置皇后进行下一行皇后的判断
count = 0  # 初始化可能数
queen([None]*8)  # 调用递归函数并赋值棋盘最大行
print(count)  # 打印总的可能个数
def black_queen(k):  # 定义黑皇后递归函数,k为行下标
   global count  # 定义全局变量
   for q in range(k - 1):  # 循环遍历前k-1列,判断是否可以放置黑皇后
       judge = b_queen[q] - b_queen[k - 1]  # 第q+1行与第k行列下标差值
       if judge == 0 or k - 1 - q == abs(judge):  # judge == 0重复放置同一列,k - 1 - q == abs(judge)黑皇后位置在同一斜线上
           return  # 此可能性不成立跳出递归
   if k == n:  # 溢出棋盘边界
       count += 1  # 放置皇后可能性+1
       return  # 跳出递归
   for q in range(n):  # 从第一列遍历到最后一列
       if q != w_queen[k] and chessboard[k][q] == 1:  # q != w_queen[k]与白皇后第k+1行列下标相同不可再放置黑皇后,
                                                       # chessboard[k][q] == 1棋盘位置条件位置为1可以放置皇后
           b_queen[k] = q  # 存储当前黑皇后列下标
           black_queen(k + 1)  # 进行下一行皇后的判断递归


def white_queen(k):  # 定义白皇后递归函数,k为行下标
   for p in range(k - 1):  # 循环遍历前k-1列,判断是否可以放置白皇后
       judge = w_queen[p] - w_queen[k - 1]  # 第q+1行与第k行列下标差值
       if judge == 0 or k - 1 - p == abs(judge):  # judge == 0重复放置同一列,k - 1 - q == abs(judge)白皇后位置在同一斜线上
           return  # 此可能性不成立跳出递归
   if k == n:  # 溢出棋盘
       black_queen(0)  # 白皇后放置完成,进行黑皇后放置递归
       return  # 跳出递归
   for p in range(n):  # 从第一列遍历到最后一列
       if chessboard[k][p] == 1:  # chessboard[k][q] == 1棋盘位置条件位置为1可以放置皇后
           w_queen[k] = p  # 存储当前白皇后列下标
           white_queen(k + 1)  # 进行下一行皇后的判断递归


n = int(input())  # 输入n表示棋盘大小
count = 0  # 放置皇后可能性
chessboard = [[] for _ in range(n)]  # 棋盘
for i in range(n):  # 循环得到棋盘位置是否可以放置皇后的条件
   arr = input().split()  # 能否放置皇后
   for j in range(n):  # 循环设置棋盘
       chessboard[i].append(int(arr[j]))  # 对棋盘设置1/0
w_queen = [0 for _ in range(n)]  # 初始化白皇后位置列下标
b_queen = [0 for _ in range(n)]  # 初始化黑皇后位置列下标
white_queen(0)  # 以白皇后为起始进行递归,0为行下标
print(count)  # 打印所有放置皇后的可能数值
def black_queen(k):
    #k为行下标
    global count
    for q in range(k-1):#循环遍历前k-1行,判断是否可以放置黑皇后
        judge=b_queen[q]-b_queen[k-1]#第q+1行与第k行列下标差值
        if judge==0 or k-1-q==abs(judge):#放在同一列,或者同一斜线上
            return
    if k==n:#溢出棋盘边界
        count+=1
        return
    for q in range(n):#从第一行遍历到最后一行
        if q!=w_queen[k] and chessboard[k][q]==1:#q不与白皇后第k+1行列下标相同不可再放置黑皇后;chessboard[k][q]==1棋盘位置为一可以放置皇后
            b_queen[k]=q# 存储当前黑皇后列下标
            black_queen(k+1)#进行下一行黑皇后
def white_queen(k):
    for p in range(k-1):
        judge=w_queen[p]-w_queen[k-1]
        if judge==0 or k-1-p==abs(judge):
            return
    if k==n:
        black_queen(0)#白皇后放置完成,进行黑皇后放置递归
        return
    for p in range(n):
         if chessboard[k][p]==1:
             w_queen[k]=p
             white_queen(k+1)
             
n=int(input())#n棋盘大小
count=0
chessboard=[[] for i in range(n)]
for i in range(n):
       chessboard[i]=list(map(int,input().split()))
w_queen=[0 for i in range(n)]
b_queen=[0 for i in range(n)]
white_queen(0)
print(count)
20.报时助手
h, m = map(int, input().split())

time = {0: 'zero', 1: 'one', 2: 'two', 3: 'three', 4: 'four', 5: 'five', 6: 'six', 7: 'seven', 8: 'eight', 9: 'nine',
        10: 'ten', 11: 'eleven', 12: 'twelve', 13: 'thirteen', 14: 'fourteen', 15: 'fifteen', 16: 'sixteen',
        17: 'seventeen', 18: 'eighteen', 19: 'nineteen', 20: 'twenty', 21: 'twenty one', 22: 'twenty two',
        23: 'twenty three', 30: 'thirty', 40: 'forty', 50: 'fifty'}
        # 其实21,22,23可以不加入字典中,但为了后边小时略去判断简化代码,直接加在字典中,方便后边直接输出小时

if m == 0:
    print(time[h] + ' o'clock')
else:
    print(time[h], end=' ')
    if 0 < m <= 20 or m == 30 or m == 40 or m == 50:
        print(time[m])
    elif 20 < m < 30:
        print(time[20] + ' ' + time[m - 20])
    elif 30 < m < 40:
        print(time[30] + ' ' + time[m - 30])
    elif 40 < m < 50:
        print(time[40] + ' ' + time[m - 40])
    else:
        print(time[50] + ' ' + time[m - 50])

21.回形取数
m,n=map(int,input().split())
row=col=count=0
qi=[[] for i in range(m)]
for i in range(m):
    qi[i]=list(map(int,input().split()))
while count<n*m:
    while row<m and qi[row][col]!=-1:#向下取数
        print(qi[row][col],end=' ')
        qi[row][col]=-1#将去过的位置设为-1
        row+=1
        count+=1
    row-=1
    col+=1
    while col<n and qi[row][col]!=-1:#向右取数
        print(qi[row][col],end=' ')
        qi[row][col]=-1
        col+=1
        count+=1
    col-=1
    row-=1
    while row>=0 and qi[row][col]!=-1:#向上取数
        print(qi[row][col],end=' ')
        qi[row][col]=-1
        row-=1
        count+=1
    row+=1
    col-=1
    while col>=0 and qi[row][col]!=-1:#向上取数
        print(qi[row][col],end=' ')
        qi[row][col]=-1
        col-=1
        count+=1
    row+=1
    col+=1
22.龟兔赛跑
v1,v2,t,s,lenth=map(int,input().split())
t2=lenth//v2
time=1
l1=l2=0
flag=False
while time<=t2:
    l1+=v1
    l2+=v2
    if l1==lenth or l2==lenth:
        break
    elif l1-l2>=t:
        for i in range(s):
            #可能在兔子休息中,乌龟就到达了终点
            l2+=v2
            time+=1
            if l2==lenth:
               flag=True
               break
        if flag:
            break
    time+=1
if l1>l2:
    print('R')
    print(time)
elif l1<l2:
    print('T')
    print(time)
else:
    print('D')
    print(time)
23.芯片测试
n=int(input())
text=[[] for i in range(n)]
for i in range(n):
    text[i]=list(map(int,input().split()))
out=[1]*n
for j in range(n):
    num=0
    for i in range(n):
        if text[i][j]==0:
            num+=1
    if num>n/2:
        out[j]=0
for i in range(n):
    if out[i]==1:
        print(i+1,end=' ')
24.FJ字符串
n=int(input())
an=''
for i in range(n):
    an=an+chr(ord('A')+i)+an
print(an)
25.sin之舞
n=int(input())
def An(n,i=1):
    if i==n:
        return 'sin('+str(n)+')'
    else:
        if i%2==0:
            s='+'
        else:
            s='-'
        return 'sin('+str(i)+s+An(n,i+1)+')'
def Sn(m,i=1):
    if m==1: 
        return An(m)+'+'+str(i)
    else:
        return '('+Sn(m-1,i+1)+')'+An(m)+'+'+str(i)
print(Sn(n))
26.数的读法

整个字符串倒着每四位截取一次存入一个列表,封装一个四位读法的函数

str.strip()把字符串头和尾的空格,以及位于头尾的nt给删掉

d = {'1':'yi', '2':'er','3':'san','4':'si','5':'wu','6':'liu','7':'qi','8':'ba','9':'jiu','0':'ling'}
n = input().strip()#str.strip()就是把这个字符串头和尾的空格,以及位于头尾的n t之类给删掉
a = []
b = [] #b存的是逆序的读法,最后再逆序输出即为结果
def numexchange(i): 
    i = i[::-1]
    for j in range(len(i)):
        if j == 0:
            if i[j]!='0':
                b.append(d[i[j]])
        elif j == 1:
            if i[j]=='0'  and  i[0]!='0':
                b.append(d['0'])
            elif i[j] == '1' and len(i)==2:
                b.append('shi')
            elif i[j]!='0':
                b.append('shi')
                b.append(d[i[j]])
        elif j == 2:
            if i[j]=='0'  and i[1]!='0':
                b.append(d['0'])
            elif i[j]!='0':
                b.append('bai')
                b.append(d[i[j]])
        elif j == 3:
            if  i[j]!='0':
                b.append('qian')
                b.append(d[i[j]])
            elif i[j]=='0'  and i[2]!='0':
                b.append(d['0'])

while n!='':  #倒着读,每四位为一组字符串
    if len(n)>=4:
        s = n[-4:] #取后四位
        n = n[:-4] #删除后四位
        a.append(s) 
    else:
        a.append(n)
        n = ''
for i in range(len(a)):
    if i == 0:
        numexchange(a[i])
    elif i == 1:
        b.append('wan')
        numexchange(a[i])
    elif i == 2:
        b.append('yi')
        numexchange(a[i])
for i in range(len(b)-1,-1,-1):
    if i == len(b)-1:
        print(b[i],end='')
    else:
        print(' %s'%(b[i]),end='')
27.完美的代价
n=int(input())
pal=list(input())

count=0#count用来计交换的次数
flag=0 #flag判断是否已经有一个单独的奇数个字符了
i=0 #用于计数外层丢弃的字符
while len(pal)>1:
    for k in range(len(pal)-1,0,-1):
        #从后面往前一直到1,寻找和pal[0]相同的pal[k]
        if pal[k]==pal[0]:
            count+=len(pal)-k-1
            #最外层的已构成回文,不考虑
            pal.pop(0)#pal(i)被pop掉后,索引整体前移1,所以k的位置需要-1
            i+=1
            pal.pop(k-1)#把找到的字符直接移到最外层,即直接pop掉
            break
        elif k==1:#如果找不到相同的,该字符放到中间
            pal.pop(0)#找不到的这个数丢弃,不能影响后续判断
            if n%2==0 or flag==1:
                print('Impossible')
                exit()
            flag=1
            count+=int(n/2)-i#把出现奇数次的字符直接移到中间需要的部署
print(count)
28.矩形面积交
while True:
    try:
        n1=list(map(float,input().split()))
        n2=list(map(float,input().split()))

    
        if n1[0]>n1[2]:
            n1[0],n1[2]=n1[2],n1[0]
        if n1[1]>n1[3]:
            n1[1],n1[3]=n1[3],n1[1]
        if n2[0]>n2[2]:
            n2[0],n2[2]=n2[2],n2[0]
        if n2[1]>n2[3]:
            n2[1],n2[3]=n2[3],n2[1]
        x=min(n1[2],n2[2])-max(n1[0],n2[0])
        y=min(n1[3],n2[3])-max(n1[1],n2[1])
        s=0
        if x<0 or y<0:
             s=0
        else:
             s=x*y
        print("{:.2f}".format(s))
    except:
        break

29.矩阵乘法
def multi_rect(rect_1, shape_1, rect_2, shape_2):
    if shape_1[1]!=shape_2[0]:
        return
    rect_=[[0 for _ in range(shape_2[1])] for _ in range(shape_1[0])]
    shape_=(shape_1[0],shape_2[0])
    for i in range(shape_1[0]):
        for k in range(shape_2[1]):
            for j in range(shape_1[1]):
                rect_[i][k]+=rect_1[i][j]*rect_2[j][k]
    return rect_,shape_
n,m=map(int,input().split())
rect=[[] for i in range(n)]
for i in range(n):
    rect[i]=list(map(int,input().split()))
result,shape=rect,(n,n)
#当方阵的0次幂为单位阵
if m==0:
    result=[[0 for _ in range(shape_2[1])] for _ in range(shape_1[0])]
    for i in range(n):
        result[i][i]=1
else:        
    for _ in range(m-1):
        result,shape=multi_rect(rect,(n,n),result,shape)
for i in range(shape[0]):
    for j in range(shape[1]):
        print(result[i][j],end=' ')
    print()
30.分解质因数
import math
#判断是否为质数
def zhi(n):
    for i in range(2,int(math.sqrt(n))+1):
        if n%i==0:
            return False
    return True
a,b=map(int,input().split())
for i in range(a,b+1):
    if zhi(i):
        print(i,'=',i,end='',sep='')
    else:
        print(i,'=',end='',sep='')
        temp=i
        while temp>1:
            for j in range(2,i):
                if temp%j==0:
                   temp=temp//j
                   if temp!=1:
                       print(j,'*',end='',sep='')
                   else:
                        print(j,end='',sep='')
                   break
    print()
31.字符串对比
str1=input()
str2=input()
if len(str1)!=len(str2):
    print('1')
else:
    if str1==str2:
        print('2')
    elif str1.upper()==str2.upper():
        print('3')
    else:
        print('4')
32.时间转换
n = int(input())
h = int(n / 3600)
m = int((n - h * 3600) / 60)
s = int(n - h * 3600 - m * 60)
print(h, ':', m, ':', s, sep='')

提高

1.预测身高
gender, father_height, mother_height = map(float, input().split())

if gender == 1:
    height = (father_height + mother_height) / 2 * 1.08
else:
    height = (father_height * 0.923 + mother_height) / 2

print('%.3f' % height)
2.最长滑雪道(深度递归搜索)
def dfs(x,y):
    max_height=1
    if dp[x][y]>0:#如果已经有了当前位置出发的最大距离,则直接返回
        return dp[x][y]
    for k in range(4):
        tx=x+next_[k][0]
        ty=y+next_[k][1]
        if tx<0 or tx>=row or ty<0 or ty>=col:#越界情况
            continue
        if arr[tx][ty]>=arr[x][y]:
            continue
        max_height=max(max_height,dfs(tx,ty)+1)#符合,递归搜索下一个位置且距离加一
    dp[x][y]=max_height#最终距离放在此矩阵中保存
    return dp[x][y]#返回该位置下的最大距离
row,col=map(int,input().split())
dp=[[0 for _ in range(col)] for _ in range(row)]  # 记录从每个位置(x, y)开始,它的最大长度
arr = [list(map(int, input().split())) for _ in range(row)]
next_=[[0, 1], [1, 0], [0, -1], [-1, 0]]  # 用来表示(x, y)的上下左右四个位置
ans=0
for i in range(row):
    for j in range(col):
        ans=max(ans,dfs(i,j))
print(ans)
3.K好数(动态规划DP)
def count(length,kind,ans):
    for i in range(1,kind):
        dp[0][i]=1
    for i in range(1,length):
        for j in range(kind):
            for k in range(kind):
                if abs(j-k)!=1:
                    if j-1==0 and k==0:#排除首位为0的情况
                        continue
                    dp[i][j]=dp[i][j]+dp[i-1][k]
                    dp[i][j]%MOD
    for i in range(kind):
        ans+=dp[length-1][i]
        ans%=MOD
    return ans
K,L=map(int,input().split())
ans=0
MOD=1000000007
dp=[[0 for _ in range(max(L,K))] for _ in range(max(L,K))]
if K==1 and L==1:
    print(0)
elif K>1 and L==1:
    print(K)
elif L>1:
    print(count(L,K,ans))
4.石子游戏(贪心原则)
n=int(input())
result=0
data=[int(input()) for _ in range(n)]
while len(data)!=1:
    data.sort()
    result+=(data[-1]+1)*(data[-2]+1)
    data[-2]+=data[-1]
    data.pop(-1)
print(result)
5.幸运顾客
n=int(input())
arr=[]
rs=[]
ans=0
for i in range(n):
    data=int(input())
    if data!=-1:
        arr.append(data)
    else:
        arr.sort()
        rs.append(arr[ans])
        ans+=1
for i in range(len(rs)):
    print(rs[i])
6.最长公共子序列(动态规划)
def lcs(str_a, str_b):
    len_a = len(a)
    len_b = len(b)
    arr = [[0 for _ in range(len_b + 1)] for _ in range(len_a + 1)]
    for i in range(len_a + 1):
        for j in range(len_b + 1):
            if i == 0 or j == 0:
                arr[i][j] = 0
            elif i > 0 and j > 0 and str_a[i - 1] == str_b[j - 1]:
                arr[i][j] = arr[i - 1][j - 1] + 1
            else:
                arr[i][j] = max(arr[i][j - 1], arr[i - 1][j])
    return arr[len_a][len_b]


a = input()

b = input()

print(lcs(a, b))

7.复数求和
n=int(input())
real=0
imaginary=0
com=[tuple(map(int,input().split())) for _ in range(n)]
for i in range(n):
    real+=com[i][0]
    imaginary+=com[i][1]
print(real,'+',imaginary,'i',sep='')
8.成绩排名(结构体)
n=int(input())
information=[tuple(input().split()) for _ in range(n)]
information.sort(key=lambda x:x[0])#先排姓名,按字母顺序
information.sort(key=lambda x:int(x[1]),reverse=True)#后排成绩,从大到小

for i in range(n):
    print(information[i][0])

9.递归倒置字符数组

字符串是不可变的,要想改变,需要把它强制转为列表

a,b=b,a

n,s=input().split()
n=int(n)
s=list(s)
i=0
while i<n//2:
    s[i],s[n-i-1]=s[n-i-1],s[i]
    print(''.join(s))
    i+=1
print('n'+''.join(s))
10.字符串跳步
s=input()
start,step=map(int,input().split())
print(s[start::step])
11.队列操作
n=int(input())
dui=[]
for i in range(n):
    a=list(map(int,input().split()))

    if a[0]==1:
        dui.append(a[1])
    elif a[0]==2:
        if len(dui)!=0:
            print(dui[0])
            dui.pop(0)
        else:
            print("no")
    else:
        print(len(dui))
12.字符串操作
s=input()
off_on=int(input())
n=int(input())
dui=[]
for _ in range(n):
    ss=input()
    if off_on==1:
        if s in ss:
            dui.append(ss)
    else:
        if s.upper() in ss.upper():
            dui.append(ss)
for i in dui:
    print(i)

13.金陵十三钗(n皇后)

n=int(input())
sum1=0
a=[list(map(int,input().split())) for _ in range(n)]
b=[0 for _ in range(n)]
queen()
print(sum1)
def queen(cur=0):
    global sum1,n
    if cur==n:#所有的皇后都正确放置完毕,输出每个皇后所在的位置
        sum2=0
        for i in range(n):
            sum2+=a[i][b[i]]
        if sum2>sum1:
            sum1=sum2
        return 0

    for i in range(n):
        flag=True
        for j in range(cur):#检测本次所放的位置是否在同行同列
            if b[j]==i:#是的话,该位置不能放,向上回溯
                flag=False
                break
        if flag:#否的话,继续放下一个
            b[cur]=i
            queen(cur+1)

真题

1.不同字串

var = '0100110001010001'
num=1
sep=1
var_n=[]
while sep<len(var):
    var_n.append(var[0:sep])
    print(var_n)
    print('--------------------------------------')
    for i in range(len(var)-sep):#以sep为间隔依次向前推进,sep每轮循环增1
        if var[i+1:i+sep+1] in var_n:
            continue
        else:
            var_n.append(var[i+1:i+sep+1])
    sep+=1
    num+=len(var_n)
    print(var_n)
    var_n=[]
print(num)
2.年号字串
string='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
ans=[0 for _ in range(5)]
index=0
n=2019
while n!=0:
    t=n%26
    n=int(n/26)
    ans[index]=string[t-1]
    index+=1
print(ans)
for i in range(index-1,-1,-1):
    print(ans[i],end='')
3.数列求值

给定数列 1, 1, 1, 3, 5, 9, 17, …,从第 4 项开始,每项都是前 3 项的和。求第 20190324 项的最后 4 位数字。

ans=[0 for _ in range(20190325)]
ans[0]=ans[1]=ans[2]=1
for i in range(3,20190325):
    ans[i]=(ans[i-1]+ans[i-2]+ans[i-3])%10000
print(ans[20190323])

4.数的分解

#把 2019 分解成 3 个各不相同的正整数之和,并且要求每个正整数都不包含数字 2 和 4,一共有多少种不同的分解方法?
#注意交换 3 个整数的顺序被视为同一种方法,例如 1000+1001+18 和 1001+1000+18 被视为同一种。

count=0
def check(x):
    while x!=0:
        t=x%10
        x=int(x/10)
        if t==2 or t==4:
            return False
    return True

for i in range(1,2019):
    if check(i):
        for j in range(i+1,2019):
            if check(j):
                k=2019-i-j
                if k>j and check(k):
                    count+=1
        
print(count)

5.迷宫(广度搜索)

#创建节点类
class Node(object):
    def __init__(self,x,y,w):
        self.x=x
        self.y=y
        self.w=w
    def __str__(self):
        return self.w
def up(node):
   return Node(node.x-1,node.y,node.w+'U')
def down(node):
    return Node(node.x+1,node.y,node.w+'D')
def left(node):
    return Node(node.x,node.y-1,node.w+'L')
def right(node):
    return Node(node.x,node.y+1,node.w+'R')

m,n=map(int,input().split())
visited=set()#存储访问过的节点
queue=[]#存储要访问的节点
arr=[[0]*(n+1)]
for i in range(1,m+1):
    arr.append([0]*(n+1))
    num="0"+input()
    for j in range(n+1):
        arr[i][j]=int(num[j])

node=Node(1,1,"")#从第一个节点开始访问
queue.append(node)
while len(queue)!=0:
    moveNode=queue[0]
    queue.pop(0)
    moveStr=str(moveNode.x)+" "+str(moveNode.y)
    if moveStr not in visited:
        visited.add(moveStr)
        if moveNode.x==m and moveNode.y==n:
            print(len(moveNode.__str__()))
            print(moveNode)
            break
        if moveNode.x < m:
                if arr[moveNode.x + 1][moveNode.y] == 0:  # 向下的情况
                    queue.append(down(moveNode))
        if moveNode.y > 1:
                if arr[moveNode.x][moveNode.y - 1] == 0:  # 向左的情况
                    queue.append(left(moveNode))
        if moveNode.y < n:
                if arr[moveNode.x][moveNode.y + 1] == 0:  # 向右的情况
                    queue.append(right(moveNode))
        if moveNode.x > 1:
                if arr[moveNode.x - 1][moveNode.y] == 0:  # 向上的情况
                    queue.append(up(moveNode))
6.特别数的和
n=int(input())

def check(x):
    while x!=0:
        t=x%10
        x=int(x/10)
        if t==0 or t==1 or t==2 or t==9:
            return True
    return False
sum=0
for i in range(1,n+1):
    if check(i):
        sum+=i
print(sum)
7.完全二叉树的权值

完全二叉树每一行的最后一个数的下标都是等于(2^n)-1

n = int(input())

data = list(map(int, input().split()))

deep = flag_deep = 1

max_sum = 0

while 2 ** deep - 1 <= n:

    data_sum = sum(data[2 ** (deep - 1) - 1:(2 ** deep)-1])

    if max_sum < data_sum:

        max_sum = data_sum

        flag_deep = deep

    deep += 1

print(flag_deep)

8.等差数列

先排序,然后找出等差数列的差值,之后从给数组的最小到最大开始循环,步长为差值

#注意要考虑公差为零的情况
n=int(input())
arr=list(map(int,input().split()))
arr.sort()
d=arr[1]-arr[0]
for i in range(n-1):
    if (arr[i+1]-arr[i])<d:
        d=arr[i+1]-arr[i]
if d==0:
    print(n)
m=(arr[-1]-arr[0])//d+1
print(m)
9.换钞票
min_count=100
for one in range(1,10):
    five=0
    two=one*10
    money=200-two*2-one
    count=0
    if money%5==0:
        five=money/5
    count=one+two+five
    if min_count>count and five!=0:
        min_count=count
print(int(min_count))
10.调手表

每次加1,遇到被整除的地方,原先的计数器置0,整除计数器加1

#最优策略按键,从任意一个分钟调到另外任意一个分钟数最多要按多少次
n,k=map(int,input().split())
ans=[]
count=count_=0

for i in range(1,n):
    if i%k!=0:
        count+=1
    else:
        count=0
        count_+=1
    ans.append(count+count_)
print(ans)
print(max(ans))

11.矩阵求和
import math
n=int(input())
arr=[[0 for i in range(n)] for i in range(n)]
sum=0
mod=10**9+7
for i in range(n):
    for j in range(n):
        arr[i][j]=(math.gcd(i+1,j+1))**2
        sum+=arr[i][j]%mod

print(sum)
12.分数
import math
a=0
for i in range(20):
    a+=2**i
gc=math.gcd(a,2**19)
print(a//gc,'/',2**19//gc,sep='')
13.购物单
def result(s):
    return (float(s[0])*float(s[1]))/100

file=open('data.txt','r')
ans=0
for line in file.readlines():
    s=line.split()
    ans+=result(s)

file.close()
print(ans)
14.等差素数列
def init_num():
    global tot
    for i in range(2, N):
        if dp[i] == 1:
            continue
        prim[tot] = i  # 记录N以内的所有素数
        tot += 1
        j = i
        while i * j < N:
            dp[i * j] = 1  # 不是素数的位置标记1
            j += 1


N = 1000010  # N的大小自己可以估计一下 想想也应该挺大的 多试几次

dp = [1, 1] + [ 0] * N

tot = 0

dif = 1

prim = [0] * N

init_num()

# print(dp[:100])
# print(prim[:100])

print(tot)

while dif * 10 < N:
    for j in range(tot):
        flag, temp = True, prim[j]
        for k in range(1, 10):  # temp后边是否再有9个满足等差条件的素数
            if temp + dif >= N or dp[temp + dif] == 1:
                flag = False
                break
            else:
                temp += dif
        if flag == True:
            print(dif, prim[j])
            exit()
    dif += 1
15.承压计算
arr = [[0] * 30 for _ in range(30)]

k = 0

file = open('data.txt', 'r')

for line in file.readlines():
    new_line = line.split()
    for i in range(len(new_line)):
        arr[k][i] = int(new_line[i])
    k += 1

for i in range(1, 30):
    for j in range(29):
        arr[i][j] += arr[i - 1][j] / 2
        arr[i][j + 1] += arr[i - 1][j] / 2

print(min(arr[29]), max(arr[29]))

print(2086458231 / min(arr[29]) * max(arr[29]))
16.方格分隔

以(3,3)为起点进行深搜,如果搜到了边界,那么它的中心对称点也到了边界 沿着已经搜过的点剪开,最后的结果要除于4

def dfs(x, y):
    global ans
    if x == 0 or x == n or y == 0 or y == n:
        ans += 1
        return

    for i in range(4):
        tx = x + directions[i][0]
        ty = y + directions[i][1]
        if arr_map[tx][ty] == 0:
            arr_map[tx][ty] = 1
            arr_map[n - tx][n - ty] = 1
            dfs(tx, ty)
            arr_map[tx][ty] = 0
            arr_map[n - tx][n - ty] = 0

    return ans / 4


n = 6
ans = 0
arr_map = [[0] * (n + 1) for i in range(7)]
directions = [(-1, 0), (1, 0), (0, -1), (0, 1)]
arr_map[3][3] = 1
# print(arr_map)

if __name__ == '__main__':
    print(dfs(n // 2, n // 2))  # 509
    # print(ans)

17.迷宫

data=[]
file=open('data.txt','r')
for line in file.readlines():
     line=list(line.strip())
     data.append(line)
data_map = [[0] * 10 for _ in range(10)]

def dfs(x, y):
    global ans
    while True:
        if x > 9 or x < 0 or y > 9 or y < 0:
            ans += 1
            # print(ans)
            break

        if data_map[x][y] == 1:
            break
        # 记录走过的位置
        data_map[x][y] = 1

        if data[x][y] == 'U':
            x -= 1

        elif data[x][y] == 'D':
            x += 1

        elif data[x][y] == 'L':
            # print(x, y)
            y -= 1

        elif data[x][y] == 'R':
            y += 1

def get_num():
    global data_map
    global ans
    for i in range(0,10):
        for j in range(0,10):
            #对每个位置进行遍历,注意每次遍历开始前要先对data_map清0
            data_map=[[0]*10 for _ in range(10)]
            dfs(i,j)
    return ans
ans=0
print(get_num())
18.15.125GB

19.约数个数
n=1200000
num=2
for i in range(2,n):
        if n%i==0:
            num+=1
print(num)
20.叶节点数
21.数字九
def check(n):
    arr=list(str(n))
    for i in range(len(arr)):
        if arr[i]=='9':
            return True
    return False
num=0
for i in range(1,2020):
    if check(i):
        num+=1
print(num)
22.数位递增的数
def check(n):
    arr=list(str(n))
    for i in range(len(arr)-1):
        if arr[i]>arr[i+1]:
            return False
    return True
num=0
n=int(input())
for i in range(1,n):
    if check(i):
        num+=1
print(num)
23.递增三元组
def check(i):
    if a[i]<a[i+1]<a[i+2]:
        return True
    else:
        return False
n=int(input())
a=list(map(int,input().split()))
a.sort()
num=0
for i in range(0,len(a)-2):
    if check(i):
        num+=1
print(num)
24.音节判断
s=list(input())
yuan=['a','e','i','o','u']
num=1
a=1
while num<len(s):
    if s[num] not in yuan:
        num+=1
    else:
        a+=1
        break
    
while num<len(s):
    if s[num]  in yuan:
        num+=1
    else:
        a+=1
        break
while num<len(s):
    if s[num] not in yuan:
        num+=1
    else:
        a+=1
        break
while num<len(s):
    if s[num] in yuan:
        num+=1
    else:
        a+=1
        break
if a==4:
    print('yes')
else:
    print('no')
25.长草
n,m=map(int,input().split())
arr=[[] for i in range(n)]
for i in range(n):
    arr[i]=list(input())

k=int(input())
next_ = [[-1, 0], [1, 0], [0, -1], [0, 1]]  # 用来表示(x, y)的上下左右四个位置

def grow_grass(x,y):
    for q in range(4):
        tx=x+next_[q][0]
        ty=y+next_[q][1]
        if tx>=0 and tx<n and ty>=0 and ty<m:
            if arr[tx][ty]=='.':
                arr[tx][ty]='g'
                flag[tx][ty]=1
for i in range(k):
    flag=[[0 for _ in range(m)] for _ in range(n)]
    for i in range(n):
        for j in range(m):
            if arr[i][j]=='g' and flag[i][j]==0:
                flag[i][j]=1
                grow_grass(i,j)
for i in range(n):
    for j in range(m):
        print(arr[i][j],sep='',end='')
    print()
26.序列计数
n=int(input())
res_list=[]
temp_list=[]
accept_list=[]
MOD=10000

def next_list(res):
    res_=[]
    size=len(res)
    ab=abs(res[size-1]-res[size-2])
    if ab<=1:
        return None
    for i in range(1,ab):
        new_res=[]
        new_res+=res
        new_res.append(i)
        res_.append(new_res)
    return res_

for i in range(1,n+1):
    res=[n,i]
    res_list.append(res)
temp_list+=res_list
while len(temp_list)>0:
    for i in range(len(temp_list)):
        next_=next_list(temp_list[i])
        if next_ is not None:
            accept_list+=next_
    temp_list.clear()
    if len(accept_list)!=0:
        temp_list=temp_list
        res_list+=accept_list
        accept_list.clear()
print(len(res_list)%MOD)
27.晚会节目单

采用了标号的方法,对每一个数按照输入从大到小进行编号,在排列好的前m个最大数在对其标号进行排序,标号小的先输出即可。

n,m=map(int,input().split())
arr=list(map(int,input().split()))
new=[]
for i in range(len(arr)):
    new.append((arr[i],i))
new=sorted(new,reverse=True)
new=new[:m:1]
new=sorted(new,key=lambda x:x[1])
for i in range(len(new)):
    print(new[i][0],end=' ')
28.合根植物
def init(n):
    for i in range(1, n+1):
        pre[i] = i


def find_pre(key):
    """找key的根,也就是找带头大哥"""
    if pre[key] == key:
        return key
    else:
        return find_pre(pre[key])  # 如果当前节点不是根节点,就找当前节点的父节点的根节点。最后的到的根就是key的根


def unite(x, y):
    """如果x和y不相连则连接它们,即x的根和y的根不同,则让一方从属于另一方"""
    rootx = find_pre(x)
    rooty = find_pre(y)
    if rootx != rooty:
        pre[rootx] = rooty


m, n = list(map(int, input().split()))
line = int(input())
ans = 0
lst = [0 for i in range(m*n+1)]
pre = [0 for i in range(m*n+1)]  # 存放以索引值为节点序号的点的根节点
init(m*n)  # 初始化每个节点的根节点都为它自己,即开始时都各不相连
for i in range(line):
    x, y = list(map(int, input().split()))
    unite(x, y)  # 每输入两个有关联的节点,就让他们相连
print(pre)
for i in range(1, m*n+1):
    lst[find_pre(i)] = 1  # 遍历每个节点,把她们对应的根节点的索引位置赋值1,比如节点1的老大是13,5的老大也是13,则他们属于1个节点集,操作和都只能将lst的13索引的地方赋值1
for i in range(1, m*n+1):  # 等于1的个数就是最后的子集个数
    if lst[i] == 1:
        ans += 1
print(ans)
29.第几个幸运数
MAX=59084709587505
a=[3,5,7]
s=set()
tou=1
while True:
    for i in a:
        t=tou*i
        if t<=MAX:
            s.add(t)
    lst=sorted(s)
    for i in lst:
        if i>tou:
            tou=i
            break
    if tou>=MAX:
        break
print(s)
print(len(s))

最后

以上就是含糊高跟鞋为你收集整理的蓝桥杯--算法的全部内容,希望文章能够帮你解决蓝桥杯--算法所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(51)

评论列表共有 0 条评论

立即
投稿
返回
顶部