2025年 蓝桥杯省赛 Python A 组题目
文章目录
- A.偏蓝
- B.IPv6
- C.2025图形
- D.最大数字
- E.倒水
- F.拼好数
- G.登山
- H.原料采购
- 近期复盘一下 省赛的题目,正所谓
知不足方能进步
- 可以在洛谷找到比赛的题目,不过得注意
由于python版本的问题
,有些代码想要在洛谷上ac
的话,需要对应调整代码(不过这也是小问题啦,主要是反思代码的思路!!!)
比赛环境
A.偏蓝
A.偏蓝
- 签到题,直接本地使用三层循环得出答案
ans = set()
for i in range(256):for j in range(i):for k in range(i):ans.add((i,j,k))
print(len(ans))
# 答案是 5559680
B.IPv6
B.IPv6
C.2025图形
.2025图形
- 签到题+1:直接先构造好全部的字符串,然后使用一个滑动窗口输出即可
h,w = map(int,input().split())
# 由于总的字符串很短,所以可以先把对应的总的字符串求解出来
a = "2025"*100000for i in range(h):print(a[i:i+w])
D.最大数字
D.最大数字
-
思路分析:
显而易见,肯定是需要排序的,那么如何排序?
排序的规则是什么? -
这个排序规则就十分巧妙:
- 首先需要转化为
字符串
,对于字符串a
和b
,如果确定它们的大小顺序?由于涉及到拼接的问题,所以a+b>b+a
的时候,就说明a
的排序价值更大,否则就是b
的排序价值更大( 推荐先完成洛谷另一个类似的问题 拼数)
- 首先需要转化为
-
洛谷
ac
代码
import sys
sys.set_int_max_str_digits(10000000)
n = int(input())# 需要定义一个函数将十进制转化为二进制
num = []
for i in range(1,n+1):tmp = []while i :tmp.append(str(i&1))i = i >> 1num.append("".join(tmp[::-1]))num = [bin(i)[2:] for i in range(1,n+1)]# 再进行排序from functools import cmp_to_keydef cmp(a,b):if a+b > b+a:return -1else:return 1# else:3# return 1num.sort(key=cmp_to_key(cmp))
finalnum = "".join(num)res = 1
ans = 0
for i in range(len(finalnum)-1,-1,-1):ans += int(finalnum[i])*resres *= 2
print(ans)
- 比赛的时候,可以不用加上(
因为比赛版本低,对于字符串转整数没有限制
)
sys.set_int_max_str_digits(10000000)
E.倒水
E.倒水
- 思路分析:求解是
最大化最小值
,所以是典型的二分
问题 - 对于二分题目不太掌握的同学可以看我的另一篇博客 蓝桥杯 之二分
# 二分问题,对于最大化最小值进行二分
n,k = map(int,input().split())
a = list(map(int,input().split()))def check(mid):num = a.copy()# 判断是否可以满足最少的水为mid for i in range(k):if num[i] < mid:return Falseaddnext = num[i] - midj = i + kwhile j < n :need = mid - num[j]if need > addnext:return Falseaddnext -= needj += kreturn Truel,r = 0,max(a)
ans = 0
while l <= r:mid = (l+r)//2if check(mid):ans = max(ans,mid)l = mid + 1else:r = mid - 1
print(ans)
F.拼好数
F.拼好数
def count6(num):return str(num).count('6')n = int(input())
numbers = list(map(int, input().split()))
c = [0] * 7 # c[0] to c[6]for num in numbers:cnt = count6(num)if cnt >= 6:c[6] += 1else:c[cnt] += 1ans = c[6]
ptr = 1while c[5] > 0:cc = (1 if ptr == 5 else 1)if cc > c[ptr] or (ans + 1, c[5] - 1, c[ptr] - 1)[0] < cc:ptr += 1else:ans += 1c[5] -= 1c[ptr] -= 1while c[4] > 0 and c[1] > 1:c[4] -= 1c[1] -= 2ans += 1ptr = 2
while c[4] > 0:cc = (1 if ptr == 4 else 1)if cc > c[ptr] or (ans + 1, c[4] - 1, c[ptr] - 1)[0] < cc:ptr += 1else:ans += 1c[4] -= 1c[ptr] -= 1while c[3] > 0 and c[2] > 0 and c[1] > 0:c[3] -= 1c[2] -= 1c[1] -= 1ans += 1ans += (3 * c[3] + 2 * c[2]) // 6print(ans)
G.登山
G.登山
H.原料采购
H.原料采购
- 思路分析:经典
反悔堆
问题