当前位置:首页>python>2026全国青少年信息素养大赛复赛Python小高组真题|t4 (7月11)

2026全国青少年信息素养大赛复赛Python小高组真题|t4 (7月11)

  • 2026-09-02 17:19:01
2026全国青少年信息素养大赛复赛Python小高组真题|t4 (7月11)
PYTHON · 题解教程2026.07

枚举每一个位置才稳妥?

切片求和,5 行

拿下黄金掩体

列表切片 · 边界处理 · 最小差值

黄金掩体 · 题解

Python算法

📦 6 Parts + Conclusion

👉 滑动

PART 01

题目大意

PROBLEM

PART 02

解题思路

SOLUTION

PART 03

完整代码

CODE

PART 04

样例验证

EXAMPLE

PART 05

常见坑点

PITFALLS

PART ///

写在最后

SUMMARY

01

PART

题目大意

PROBLEM

有 N 个掩体,编号 1~N,每个掩体都有一个“火力值” F[1] ~ F[N]。

我们要找一个“黄金掩体”,它需要满足前提条件与计算规则,再按筛选规则挑出唯一答案。

前提条件

左边至少有 k 个掩体 → 编号 ≥ k+1

右边至少有 k 个掩体 → 编号 ≤ N-k

所以合法范围是:k+1 ≤ i ≤ N-k

计算规则

左侧 k 个邻居火力和 = S_left

右侧 k 个邻居火力和 = S_right

差值绝对值 = |S_left - S_right|

筛选规则

1

找所有合法位置中,差值最小的那个;

2

多个位置差值相同 → 选编号最大的;

3

没有合法位置 → 输出 -1

02

PART

解题思路

SOLUTION

第一步:读懂输入输出

先看清输入输出格式,再动手写逻辑。

输入格式

第一行:N k

第二行:N 个非负整数 F[1] ~ F[N]

输出格式

符合条件的掩体编号;没有则输出 -1

第二步:核心逻辑 —— 遍历 + 切片求和

用 Python 的列表切片快速算左右两侧的和,不用手写循环累加。

左侧 k 个:F[i-k : i](从 i-k 到 i-1)

右侧 k 个:F[i+1 : i+k+1](从 i+1 到 i+k)

然后算差值绝对值,记录最小值和对应位置。

!踩坑提示 🕳

Python 列表索引从 0 开始,但题目要求输出编号从 1 开始,最后记得 +1!

第三步:关键技巧 —— 相等时选最大编号

从前往后遍历,遇到相同差值,后面的位置编号更大,直接覆盖记录即可。

位置3差值=20 → 记3;位置4差值=20 → 覆盖为4 ✅

03

PART

完整代码

CODE

下面是完整代码(带注释,新手可直接抄):

...python

def solve():

  # 读取第一行:N, k

  line1 = input().split()

  if not line1:

    return

  N = int(line1[0])

  k = int(line1[1])

  # 读取第二行:火力数组 F

  F = list(map(int, input().split()))

  # 检查是否有合法位置:合法范围是 [k, N-k-1](索引)

  if N - 1 - k < k:

    print(-1)

    return

  min_diff = float('inf') # 初始化最小差值为无穷大

  result_pos = -1 # 初始化结果为 -1

  # 遍历合法位置(索引从 k 到 N-k-1)

  for i in range(k, N - k):

    # 左侧 k 个求和

    S_left = sum(F[i - k : i])

    # 右侧 k 个求和

    S_right = sum(F[i + 1 : i + k + 1])

    # 计算差值绝对值

    current_diff = abs(S_left - S_right)

    # 更新最小值和位置

    if current_diff < min_diff:

      min_diff = current_diff

      result_pos = i + 1 # 编号从1开始,索引+1

  print(result_pos)

if __name__ == "__main__":

  solve()

04

PART

样例验证

EXAMPLE

以样例 1 为例,验证上面的逻辑:

输入

7 2

10 15 30 50 20 5 25

合法位置:编号 3、4、5(对应索引 2、3、4)

编号
左侧和
右侧和
差值
3
[10,15]=25
[50,20]=70
|25-70|=45
4
[15,30]=45
[20,5]=25
|45-25|=20 ← 最小
5
[30,50]=80
[5,25]=30
|80-30|=50

✅ 输出:4

05

PART

常见坑点

PITFALLS

新手最常踩的 3 个坑:

1

索引搞错:Python 切片是左闭右开,F[a:b] 包含 a,不包含 b。

2

编号 vs 索引:题目要输出编号(1~N),代码里用索引(0~N-1),记得 +1。

3

边界情况:当 N < 2k+1 时,根本没有合法位置,直接输出 -1。

///

LAST

写在最后

SUMMARY

遍历合法位置 → 切片求和 → 算差值 → 记最小 + 最大编号

这道题本质是考察你对列表切片、循环、条件判断的掌握,只要理清逻辑,新手也能轻松拿下!

我是 神仙不在,热衷于分享算法题解与 Python 干货

既然看到这里了,如果觉得有用,随手点个赞、在看、转发三连吧。

点赞
在看
转发

THANKS FOR READING

最新文章

随机文章