3蓝桥杯练习系统 python
记录蓝桥杯刷题过程
上接:
1:https://blog.csdn.net/m0_45813696/article/details/115583882
2:https://blog.csdn.net/m0_45813696/article/details/115595814
目录
二、算法训练
ALGO-1 区间k大数查询
n = input()
s = list(map(int, input().split()))
m = int(input())
a = []
for i in range(m):
l,r,k=map(int,input().split())
s1= sorted(s[l-1:r], reverse=True) #降序,s[l:r]左闭右开
a.append(s1[k-1])
for j in range(m):
print(a[j])
ALGO-2 最大最小公倍数(贪心)
n = int(input())
if n <= 2:
print(n)
elif(n % 2 != 0): #分析之后发现如果输入为奇数,结果:n(n-1)(n-2)
print(n * (n-1) * (n-2))
else: #发现如果输入为偶数,分两种情况
if n % 3 == 0: #是3的倍数
print((n-1)*(n-2)*(n-3))
else: #不是3的倍数
print(n*(n-1)*(n-3))
ALGO-3 K好数(动态规划)
K,L=list(map(int,input().split()))
num=[[0 for i in range(L)] for j in range(K)] #创建K行L列的矩阵
for i in range(K):
num[i][0]=1
for j in range(L-1): #位数
for i in range(K):
tmp=0
for k in range(K): #最开始一位:0--K-1
if k==i or abs(k-i)!=1:
tmp+=num[k][j]
num[i][j+1]=tmp
ans=0 #K好数个数
for i in range(1,K):
ans+=num[i][L-1]
print(ans%1000000007)
ALGO-49 寻找数组中最大值
n=int(input())
list1 = list(map(int, input().split()))
max = max(list1)
num = list1.index(max) #index() 用于从列表中找出与某个值第一个匹配的索引位置。
print(max,num)
ALGO-51 Torry的困惑(基本型)
def is_prime(num): #判断是否为质数
for i in tmp: # 遍历质数数组
if num % i == 0:
return False
tmp.append(num)
return True
i = 3 # 如果n大于2, 从数字3开始遍历
ans = 2 # 默认填入第一个质数
tmp = [2] # 质数数组
n = int(input())
while True:
if len(tmp) >= n:
break
if is_prime(i):
ans *= i
i += 1
print(ans % 50000)
ALGO-53 最小乘积(基本型)
T=int(input())
for i in range(T):
n=int(input())
a=list(map(int,input().split()))
b=list(map(int,input().split()))
a.sort(reverse=False) #升序
b.sort(reverse=True) #降序
ans=0
for j in range(len(a)):
ans=ans+a[j]*b[j]
print(ans)
ALGO-84 大小写转换(字符操作)
a=str(input())
b=a.swapcase() #大小写互换
print(b)
ALGO-91 Anagrams问题(数组运算 字符操作)
```python
a=str(input())
b=str(input())
a=a.upper()
bb.upper() #全换成大写
ans=0
if len(a)!=len(b):
print('N')
else:
for i in range(len(a)):
if a.count(a[i])!=b.count(a[i]): #count() 方法用于统计字符串里某个字符出现的次数
ans=1
print('N')
break
if ans==0:
print('Y')
ALGO-148 5-1最小公倍数
def gcd(a,b): #求最大公约数
c=a%b
while c!=0:
a=b
b=c
c=a%b
return b
a,b=map(int,input().split())
lcm=a*b/gcd(a,b) #!!!
print(int(lcm))
ALGO-150 6-1 递归求二项式系数值
def C(k,n):
if k == n or k == 0:
return 1
else:
return C(k, n-1)+C(k-1,n-1) #递归
k,n = map(int, input().split())
print(C(k,n))
ALGO-195 1的个数
n=int(input())
ans=0
for i in range(1,n+1):
strn=str(i)
ans+=strn.count('1') #count() 方法用于统计字符串里某个字符出现的次数
#str.(sub, start= 0,end=len(string))
print(ans)
三、历届真题
翻硬币(贪心)
sta=input()
end=input()
sta_nums=[]
end_nums=[]
ant=0
#把硬币的状态转化为1和0,正面为1,反面为0
for i in sta:
sta_nums.append(1) if i=='*' else sta_nums.append(0)
for j in end:
end_nums.append(1) if j=='*' else end_nums.append(0)
for i in range(len(sta_nums)-1): #贪心:最多翻n-1次
if end_nums[i]!=sta_nums[i]:
sta_nums[i],sta_nums[i+1]=int(not sta_nums[i]),int(not sta_nums[i+1])
ant+=1
print(ant)
PREV-1 核桃的数量
a,b,c=map(int,input().split())
if a<30 and b<30 and c<30:
m=max(a,b,c)
while True:
if m%a==0 and m%b==0 and m%c==0:
print(m)
break
m+=1
硬币拼凑指定面额
money=[1,5,10,20,50,100]
n = int(input())
li=[]
for i in range(n+1):
li.append(0)
li[0]=1
for i in money:
for j in range(n+1):
if j>=i:
li[j]=li[j]+li[j-i]
print(li)
print(li[n])
最大子串问题
def FindGreatestSumOfSubArray(array): #求最大子串
f = array[0]
res = array[0]
for i in range(1,len(array)):
f = max(f+array[i],array[i])
res = max(res,f)
return res
array=[6,-3,-2,7,-15,1,2,2]
print(FindGreatestSumOfSubArray(array))
判断是否为质数
n=int(input())
def isnum(a): #判断是否为质数
if a==2:
return True
elif a > 2:
for i in range(2,a):
if (a% i) == 0:
return True
else:
return False
else:
return False
print(isnum(2))