先说句实话:这套题的画风非常统一——披着长征故事的外衣,考的都是最朴素的编程功底。从文化的角度,似乎这是一种方式,熏陶红色等,也有人说过于思政。没有花里胡哨的数据结构,没有让人头秃的图论,四道题分别对应"模拟""条件判断""滑动窗口""贪心+排序",是一套非常标准的"基础关卡打怪升级"式题目。适合练手,也适合暴露细节漏洞——尤其是第一题,坑就藏在输入格式里。
这题本身没什么难度,就是取商和余数,小学数学水平。但题目原文给的参考代码有一个输入格式的坑:题目描述里说得清清楚楚,"一行两个整数",可参考代码却写成了两次 int(input()),也就是默认两个数分两行输入。如果真按样例"一行输入 100 8"去跑,这份代码会直接崩掉。这是很多初学者最容易踩的雷——读题看格式,不能只看变量名对不对,还要看输入是几行。
思路:整除拿商,取模拿余数,Python 一行内置运算符就能搞定,没有任何算法难度,纯粹考察对输入格式的把控。
正确代码:
total, n = map(int, input().split()) # 一行两个整数,用 split() 拆开a = total // n # 每人分到的粮食数b = total % n # 余数作为备用粮食print(a, b)复杂度:O(1),稳如老狗。
披着"加密电报"的皮,本质是最经典的"日期合法性校验",属于每个学编程的人迟早要手写一遍的模拟题。核心考点就一个:闰年怎么判断,能背下来"四年一闰、百年不闰、四百年再闰"这条规则,这题就是送分。
思路:
m 是否在 1~12 之间,不在直接判 NO;d 是否落在 [1, 当月天数] 区间内。闰年规则:能被 400 整除 → 闰年;能被 4 整除但不能被 100 整除 → 闰年;其余都是平年。
代码:
y, m, d = map(int, input().split())defis_leap(year):return year % 400 == 0or (year % 4 == 0and year % 100 != 0)# 每月天数表(先按平年填2月)dm = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]if1 <= m <= 12: max_day = dm[m - 1]if m == 2and is_leap(y): max_day = 29# 闰年2月29天if1 <= d <= max_day: print("YES")else: print("NO")else: print("NO")复杂度:O(1),纯条件判断,没有任何循环。
题目名字听起来像是要考"最多不同颜色的子序列"这种硬核题,但仔细读数据范围和题意会发现:窗口大小 k 是固定的,只是要你在所有长度为 k 的连续区间里,找出不同颜色种类数最多的那一个。这其实是滑动窗口 + 计数的模板题,n 最大到 30 万,也在提醒你:暴力枚举每个窗口再去重(O(n·k))会超时,得用滑动窗口把复杂度降到 O(n)。计数这块不需要上哈希表这种"重武器",用一个普通数组当计数器就够了,思路更直白。
思路:
count[c] 表示颜色 c 在当前窗口内出现的次数),比用字典更直观,也更适合手动模拟;dis 实时记录当前窗口内不同颜色的种类数,随着元素进出增减,同步更新最大值。代码:
n, k = map(int, input().split())colors = list(map(int, input().split()))max_color = max(colors)count = [0] * (max_color + 1) # 用数组代替哈希表计数dis = 0ans = 0for i in range(n):# 新元素进入窗口if count[colors[i]] == 0: dis += 1 count[colors[i]] += 1# 窗口大小超过 k,移出最左边的元素if i >= k: left = colors[i - k] count[left] -= 1if count[left] == 0: dis -= 1# 窗口大小达到 k 时才更新答案if i >= k - 1: ans = max(ans, dis)print(ans)这是整套题里"含金量"最高的一道,考的是一个非常经典的贪心结论:要把有序数列分成 k 组,使各组"极差之和"最小,只需要在相邻差值最大的 k-1 个位置切开。原理其实不难证明——排序后整个数列的总跨度(最大值减最小值)等于所有相邻差值的总和(差分telescope),而"切一刀"相当于把某个差值从"组内差距"中剔除出去。要让剩下的总和最小,当然要优先剔除最大的那些差值。
思路:
代码:
n, k = map(int, input().split())a = list(map(int, input().split()))a.sort()if n == 1: print(0)else: diffs = [a[i + 1] - a[i] for i in range(n - 1)] diffs.sort(reverse=True) tr = a[-1] - a[0] # 整体极差 = 所有相邻差值之和 removed = sum(diffs[:k - 1]) # 切掉最大的 k-1 个差值 print(tr - removed)验证样例1:排序后 [1,3,6,9,12],相邻差 [2,3,3,3],整体极差 12-1=11,切掉最大的 2 个差值(3+3=6),11-6=5,与样例输出一致。
复杂度:O(n log n),瓶颈在排序。
四道题从"模拟"到"贪心"层层递进,非常适合作为初中组同学检验基本功的一套题——尤其提醒大家,读题的时候一定要把输入输出格式看仔细,很多时候不是算法不会,而是输入格式没读对,白白丢分。
【题目描述】
长征途中,红军战士们获得了一批粮食。他们决定按照以下规则分配:将粮食平均分成若干份,如果分完后有余数,则余数部分作为备用粮食。输出每人分到的粮食数和余数。
【输入格式】
一行两个整数 和 ,分别表示粮食总数和战士人数。
【输出格式】
一行两个整数,分别表示每人分到的粮食数和余数。
【样例】
样例1
输入:
100 8输出:
12 4说明:100单位粮食分给8名战士,每人12单位,余4单位。
样例2
输入:
50 6输出:
8 2说明:50单位粮食分给6名战士,每人8单位,余2单位作为备用粮食。
样例3
输入:
81 9输出:
9 0说明:81单位粮食分给9名战士,正好每人9单位,没有余数。
【数据范围】
【题目描述】
前线指挥部收到一封加密电报,其中包含一个日期信息,需要验证该日期是否有效。给定年份 y、月份 m、日期 d,判断这是一个合法的日期。
注意事项:
【输入格式】
输入三个整数 y、m、d,分别表示年、月、日。
【输出格式】
如果日期合法输出 YES,否则输出 NO。
【样例】
样例1
输入:
2024 2 29输出:
YES解释:2024能被4整除且不能被100整除,是闰年,2月有29天。
样例2
输入:
2023 2 29输出:
NO解释:2023是平年,2月只有28天。
样例3
输入:
2024 4 31输出:
NO解释:4月只有30天。
【数据范围】
【题目描述】
为了更好的宣传红色文化,红军文化展览馆展出了 面旗帜,每面旗帜都有不同的颜色编号。现在需要统计:在任意连续 面旗帜中,最多能有多少种不同的颜色?
【输入格式】
第一行 和 ,第二行 个颜色编号。
【输出格式】
输出最多不同颜色数。
【样例】
样例1
输入:
8 31 2 3 2 1 3 4 3输出:
3解释:任意连续 3 面旗帜中,最多有 3 种不同颜色。
样例2
输入:
6 21 2 1 2 1 2输出:
2样例3
输入:
5 15 5 5 5 5输出:
1【数据范围】
根据您提供的两张图片,已提取并整合出完整的题目内容,输出 Markdown 如下:
【题目描述】
经历过数次战斗后,红军战地医院共接收了 名伤员,为了更好的进行针对性治疗,医生需要将伤员按伤情程度需要分成 组,要求各组内的伤情差距尽可能小。我们定义一个组的伤情差距为这个组内伤情程度最大值与最小值的差。因此医生们会按下述策略进行分组:
将所有伤情值排序,找出相邻伤情差值最大的 处,在这些位置切分,形成 组,这样总是能使得所有组的伤情差距的总和最小。
【输入格式】
第一行 和 ,第二行 个伤情值
【输出格式】
输出所有组的伤情差距的最小总和
【样例】
样例1
输入:
5 31 3 6 9 12输出:
5解释:排序后 [1,3,6,9,12],相邻差 [2,3,3,3],取最大的2个差值位置分割,可以分割为[1,3] [6,9] [12]这样的三组,第1组伤情差距为2,第2组伤情差距为3,第3组伤情差距为0,所有组的伤情差距总和为2+3+0=5。
样例2
输入:
4 21 5 9 13输出:
8样例3
输入:
6 31 2 3 4 5 6输出:
3【数据范围】


往期导读
===========================
往期文章导读:
【信息素养】
1726年4月

1726年4月

1626年4月

1326年4月

【SC】
126月

255月

【C++】
067月

266月

116月

076月

285月

【蓝桥杯】
1324年1月

1224年1月

315月

295月

285月

新鲜出炉!蓝桥杯国赛真题(sc)
【等级考试】
136月

125月


编者不易,分享、在看与点赞,至少我要拥有一个吧