当前位置:首页>python>谈谈今天的信息素养大赛Python初中组的题目

谈谈今天的信息素养大赛Python初中组的题目

  • 2026-09-05 14:17:07
谈谈今天的信息素养大赛Python初中组的题目
前言:后台看到不少需要CSP-J初赛真题的,之前的分享链接应该是失效了。今天会重新分享一下,顺便更新2025的真题。

从"分粮食"到"分伤员":星火征途初中组复赛Python题解全解析

先说句实话:这套题的画风非常统一——披着长征故事的外衣,考的都是最朴素的编程功底。从文化的角度,似乎这是一种方式,熏陶红色等,也有人说过于思政。没有花里胡哨的数据结构,没有让人头秃的图论,四道题分别对应"模拟""条件判断""滑动窗口""贪心+排序",是一套非常标准的"基础关卡打怪升级"式题目。适合练手,也适合暴露细节漏洞——尤其是第一题,坑就藏在输入格式里。

第一题:长征分粮 —— 送分题里也有陷阱

这题本身没什么难度,就是取商和余数,小学数学水平。但题目原文给的参考代码有一个输入格式的坑:题目描述里说得清清楚楚,"一行两个整数",可参考代码却写成了两次 int(input()),也就是默认两个数分两行输入。如果真按样例"一行输入 100 8"去跑,这份代码会直接崩掉。这是很多初学者最容易踩的雷——读题看格式,不能只看变量名对不对,还要看输入是几行。

思路:整除拿商,取模拿余数,Python 一行内置运算符就能搞定,没有任何算法难度,纯粹考察对输入格式的把控。

正确代码:

total, n = map(int, input().split())  # 一行两个整数,用 split() 拆开a = total // n   # 每人分到的粮食数b = total % n    # 余数作为备用粮食print(a, b)

复杂度:O(1),稳如老狗。


第二题:电报日期 —— 判断题里的"闰年三连问"

披着"加密电报"的皮,本质是最经典的"日期合法性校验",属于每个学编程的人迟早要手写一遍的模拟题。核心考点就一个:闰年怎么判断,能背下来"四年一闰、百年不闰、四百年再闰"这条规则,这题就是送分。

思路:

  1. 先判断月份 m 是否在 1~12 之间,不在直接判 NO;
  2. 根据月份确定当月天数上限,2 月要单独判断是否闰年;
  3. 判断 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)。计数这块不需要上哈希表这种"重武器",用一个普通数组当计数器就够了,思路更直白。

思路:

  1. 颜色编号是有限的整数,直接开一个数组当计数器(count[c] 表示颜色 c 在当前窗口内出现的次数),比用字典更直观,也更适合手动模拟;
  2. 窗口每向右滑一格,新进来的颜色计数 +1,滑出去的颜色计数 -1,如果计数变为 0 说明这种颜色离开了窗口;
  3. 用一个变量 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)

复杂度:O(n),每个元素最多进出窗口各一次;额外空间 O(最大颜色编号)。

第四题:战地医院 —— 贪心分组的经典套路

这是整套题里"含金量"最高的一道,考的是一个非常经典的贪心结论:要把有序数列分成 k 组,使各组"极差之和"最小,只需要在相邻差值最大的 k-1 个位置切开。原理其实不难证明——排序后整个数列的总跨度(最大值减最小值)等于所有相邻差值的总和(差分telescope),而"切一刀"相当于把某个差值从"组内差距"中剔除出去。要让剩下的总和最小,当然要优先剔除最大的那些差值。

思路:

  1. 排序;
  2. 求出所有 n-1 个相邻差值;
  3. 把这些差值从大到小排序,取前 k-1 个(切分点)求和;
  4. 用整体极差减去这部分和,即为答案。

代码:

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),瓶颈在排序。

总结一下

题目
考点
复杂度
长征分粮
整除与取模 + 输入格式细节
O(1)
电报日期
条件分支 + 闰年判断
O(1)
红旗展览
滑动窗口 + 数组计数
O(n)
战地医院
排序 + 贪心(极差分组)
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,判断这是一个合法的日期。

注意事项:

  • 月份必须在 1 到 12 之间
  • 不同月份的天数不同:
    • 1、3、5、7、8、10、12月有31天
    • 4、6、9、11月有30天
    • 2月需要判断闰年
  • 闰年判断规则:
    • 能被 400 整除的年份是闰年
    • 能被 4 整除但不能被 100 整除的年份是闰年
    • 其他年份都是平年
    • 闰年2月有29天,平年2月有28天

【输入格式】

输入三个整数 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

【数据范围】

干货
CSP-J初赛真题获取方式,后台回复:CSP-J初赛历年真题
内容不包含解析,广告一下,有需要详细解析的(参考如下),扫码购买。

往期导读

===========================

往期文章导读:

【信息素养】

1726年4月

信息素养历年真题获取方式:点我

1726年4月

25年信息素养大赛算法创意小学组初赛卷2真题解析

1626年4月

25年信息素养大赛算法创意小学组初赛真题解析

1326年4月

25赛季信息素养大赛算法创意真题

【SC】

126月

需要蓝桥杯国赛SC素材点这

255月

(scratch项目)模拟题

【C++】

067月

CSP-J/S真题

266月

GESP最新真题

116月

信息学奥赛选苗测试题

076月

近五年CSP-J初赛考点分析

285月

GESP编程等级认证

【蓝桥杯】

1324年1月

蓝桥杯STEMA测评最新真题py

1224年1月

蓝桥杯STEMA测评最新真题C

315月

第14届蓝桥杯Python国赛(中级)真题及解析

295月

第14届蓝桥杯C++国赛(中级)真题及解析

285月

新鲜出炉!蓝桥杯国赛真题(sc)

【等级考试】

136月

202305电子学会考级真题免费分享

125月

202303电子学会考级真题免费分享

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

最新文章

随机文章