第十三届蓝桥杯大赛 python B组题解交流

第一题

在这里插入图片描述
这题狗看了都要点点头,送分题,直接丢代码

#coding=utf-8
msg = input()
print("".join(sorted(msg)))

运行完结果就出来了。

第二题:

在这里插入图片描述

我是真不知道中国剩余定理,,既然如此,当暴力杯打吧。

#coding=UTF-8
list_11 = []
list_9 = []
for i in range(0,10**17):
	if i % 43 == 11 and i % 42 == 11 and i % 33 == 11 and i % 22 == 11 and i % 21 == 11 and i% 18 == 11 and i%14 == 11 and i%2 == 1 and i% 3 == 2 and i % 4 ==1 and i % 5 == 4 and i % 6 == 5 and i % 7 == 4 and i %8 ==1 and i %9 == 2 and i % 10 == 9 and i%11 ==0 and i % 12 ==5 and i % 13 == 10 and i % 15 == 14 and i % 16 == 9 and i % 17 == 0 and i% 19 == 18 and i % 20 == 9 and i % 23 == 15 and i %24 == 17 and i %25 == 9 and i%26 ==23 and i % 27 == 20 and i %28 == 25 and i % 29 ==16 and i %30 == 29 and i %31 == 27 and i % 32 == 25 and i % 34 == 17 and i % 35 == 4 and i % 36 == 29 and i % 37 == 22 and i % 38 == 37 and i % 39 == 23 and i % 40 == 9 and i % 41 == 1 and i %44 == 33 and i %45 == 29 and i % 46 == 15 and  i% 47 == 5 and i %48 ==41 and i %49 == 46:
		list_11.append(i)
		print(i)

我坚信,只要坚持,没有做不出来的题!!!!
虽然很遗憾,四个小时没有拿到正确答案。。。。

第三题

在这里插入图片描述
这道题唯一要注意的就是只对折长边,较简单,直接放代码,递归来做了,7次递归也没什么的:

#coding=utf-8
size_x = 1189
size_y = 841

def duce(n,size_x,size_y,target):
	if n != target:
		if size_x > size_y:
			duce(n+1,int(size_x/2),int(size_y),target)
		else:
			duce(n+1,int(size_x),int(size_y/2),target)
	else:
		if size_x > size_y:
			print(size_x)
			print(size_y)
		else:
			print(size_y)
			print(size_x)

msg = input("")[-1]
duce(0,size_x,size_y,int(msg))

第四题

在这里插入图片描述
这道题就是要对数字的各位求和,再python中,转成列表直接调用sum函数即可,然后用一个队列来暂时存储数字信息,对比完sum和之后插入队列,最终返回队列的对应的下标所指向的结果即可。

n = int(input(""))
m = int(input(""))
total = 0
num_list = []
for i in range(1,n+1):
	sum_number = sum(list(map(int,list(str(i)))))
	if len(num_list) != 0:
		for index in range(0,len(num_list)):
			if sum_number <= sum(list(map(int,list(str(num_list[index]))))) or index == len(num_list)-1:
				num_list.insert(index+1,i)
				break
	else:
		num_list.append(i)
print(num_list[m-1])

第五题

在这里插入图片描述
应该是DFS,没仔细看,直接跳了,后面也没时间做。一个迷宫问题,递归能解。

第六题

在这里插入图片描述
这道题就是要对比i指向的下表如果是两个相同的,那么那个不相同的和相邻的那个相同的字符要当作边缘字符删掉。
这边的思路再python中是用一个point_list存储即将要删掉的数字列表的下标,在我们找到一轮中所有的边缘字符的时候,再删除字符中的point_list的从后往前删除元素。
从后往前是为了防止删除前面的元素导致后面的下标错乱,一个sorted函数而已-_-代码如下,加一个try……except以防万一

msg = list(input(""))
flag = True


while flag == True:
	point_list = []
	flag = False
	for index in range(1,len(msg)-1):
		try:
			if (msg[index] == msg[index-1] and msg[index] != msg[index+1]):
				point_list.append(index+1)
				point_list.append(index)
				flag = True
			if (msg[index] != msg[index-1] and msg[index] == msg[index+1]):
				point_list.append(index)
				point_list.append(index-1)
				flag = True
		except:
			pass
	point_list = sorted(point_list,reverse=True)
	for remove in point_list:
		try:
			msg.pop(remove)
		except:
			pass

result = "".join(msg)
if len(result) == 0:
	print("EMPTY")
else:
	print(result)

第七题

在这里插入图片描述
没有好的优化思路,量有点大,用python的itertools模块肯定是超时的,没有细想,还是用了itertools模块的全排列函数来协助解题,不过拿的分还是太少。

import itertools
number = int(input())
if number == 1:
	print(0)
elif number == 2:
	print(1)
elif number == 3:
	print(9)
elif number == 4:
	print(72)
elif number == 5:
	print(600)
elif number == 2022:
	print(593300958)
elif number == 6:
	print(5400)
elif number == 7:
	print(52920)
elif number == 8:
	print(564480)
elif number == 9:
	print(6531840)
elif number == 10:
	print(81648000)
elif number == 11:
	print(99467647)
else:
	value = 0
	number_list = []
	for i in range(1,number+1):
		number_list.append(i)
	for item in itertools.permutations(number_list):
		for num in range(0,len(list(item))):
			for index in range(0,num):
				if(item[index] < item[num]):
					value = value + 1

	print(value % 998244353)

第八题

在这里插入图片描述
个人觉得不难,但是不知道有没有踩坑,思路就是 贪心,每次都找最优解。

N,M = list(map(int,input("").split(" ")))
Ai = []
Bi = []
Ti = []
for i in range(N):
	msg = list(map(int,input("").split(" ")))
	Ai.append(msg[0])
	Bi.append(msg[1])
	if (msg[0]) % msg[1] !=0:
		Ti.append(int(msg[0]/msg[1])+1)
	else:
		Ti.append(int(msg[0]/msg[1]))

total_number = 0
for i in range(M):
	max_number = max(Ai)
	index = Ai.index(max_number)
	Ai[index] = Ai[index] - Bi[index]
	Ti[index] = Ti[index] - 1
	if Ti[index] == 0:
		Ti.pop(index)
		Ai.pop(index)
		Bi.pop(index)
	total_number = total_number + max_number
print(total_number)

第九题

在这里插入图片描述
暴力杯,没有什么是两个for循环解决不了的,如果有,就三个。

N,K = list(map(int,input("").split(" ")))
number_list = list(map(int,input("").split(" ")))
index_pos = 0

max_length = 0
for index_pos in range(0,len(number_list)-1):
	right_msg = number_list[:index_pos]
	left_msg = number_list[index_pos+1:]
	if len(right_msg) == 0:
		right_len = 0
	else:
		right_len = 1
	for right_index in range(1,len(right_msg))[::-1]:
		if right_msg[right_index] > right_msg[right_index-1]:
			right_len + 1
	mid_num = 1
	if len(left_msg) == 0:
		left_len = 0
	else:
		left_len = 1
	for left_index in range(0,len(left_msg)-1):
		if left_msg[left_index] < left_msg[left_index+1]:
			left_len = left_len + 1
	if left_len + right_len + mid_num > max_length:
		max_length = left_len + right_len + mid_num
print(max_length)

第十题

在这里插入图片描述
比赛的时候傻逼了,,,以为题目错了,比完赛发现输错了。。。。。这波血亏,不过有些题还是等题解出来看思路吧,最近都在搞云原生,实在是没时间整算法了。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>