上一节把三道经典 A+B 入门题刷完,把最基础的输入输出、循环、条件判断过了一遍。这一节继续往下推进,从两数相加升级到一行多数字求和,再正式接触数组的基础操作,最后用一道简单应用题练练手。这一节会引入map函数、range 步长、输出格式控制这些高频技巧,都是后面刷题天天要用的东西。
第 4 题:A+B 问题 IV
题目描述
你的任务是计算若干整数的和。
输入描述
每行的第一个数 N,表示本行后面有 N 个数。 如果 N=0 时,表示输入结束,且这一行不要计算。
输出描述
对于每一行数据需要在相应的行输出和。
输入示例
4 1 2 3 4 5 1 2 3 4 5 0输出示例
10 15我的思路
这题本质就是「每行第一个数告诉我们后面有几个数,然后求后面这些数的总和」,遇到 N=0 就终止。 逻辑上和第三题的「0 0 结束」很像,只不过从两个数变成了 N 个数。最开始我就老老实实切列表、取第一个元素做判断,再循环累加后面的数字。
第一版代码(原始写法)
while 1: n = input().split() if int(n[0]) == 0: break sum = 0 for i in range(int(n[0])): sum = sum + int(n[i + 1]) print(sum)优化写法:用 map + sum 简化
这里就可以引入一个非常好用的工具:map函数。它可以批量把字符串转成整数,再配合列表切片和sum函数,不用手动写循环累加,代码会简洁很多。
优化后代码:
while True: try: nums = list(map(int, input().split())) if nums[0] == 0: break print(sum(nums[1:])) except: break本题核心知识点
- 一行多整数的标准读取方式:
list(map(int, input().split())),一步完成「读取 → 分割 → 批量转整数」,后面刷题会反复用到。 - 列表切片:
nums[1:]表示从索引 1 到列表末尾,直接拿到所有待求和的数字,省去手动按索引取值。 - 结束标志处理:先判断 N 是否为 0,再执行计算,保证结束行不参与运算。
第 6 题:A+B 问题 VIII
题目描述
你的任务是计算若干整数的和。
输入描述
输入的第一行为一个整数 N,接下来 N 行每行先输入一个整数 M,然后在同一行内输入 M 个整数。
输出描述
对于每组输入,输出 M 个数的和,每组输出之间输出一个空行。
输入示例
3 4 1 2 3 4 5 1 2 3 4 5 3 1 2 3输出示例
10 15 6提示信息
测试数据有多组,也就是会有多个 N 输入。组内每两个结果之间有空行,最后一行结果后不加空行;两组数据之间也没有额外空行。
我的思路
这题就是 A+B II 的升级版:外层先读 N,然后 N 行数据,每行又是「M + M 个数字」的格式,相当于套了两层循环。 最容易踩坑的地方是空行格式:很容易随手每行结果后面都加个空行,导致最后一行多输出一个空行,提交判格式错误。 我的处理思路是:只有不是当前组最后一行的时候,才打印空行,这样就能精准控制分隔。
我的代码
while 1: try: n = input() for i in range(int(n)): sum = 0 m = input().split() for j in range(int(m[0])): sum = sum + int(m[j + 1]) print(sum) if i < int(n) - 1: print() except: break空行控制技巧
if i < int(n) - 1: print()这个判断非常实用:
- 循环变量 i 从 0 开始,到 n-1 结束
- 当 i 还没到最后一行时,输出结果后加一个空行
- 最后一行只输出结果,不加空行 这是算法题里控制输出分隔符的通用思路,后面遇到空格、逗号分隔都可以这么写。
本题核心知识点
- 嵌套循环:外层 while 处理多组数据,中层 for 控制每组行数,内层处理每行数字求和。
- 输出格式控制:用「非最后一项才输出分隔符」的思路,避免末尾多余空行 / 空格。
- 多组输入模板复用:外层
while + try/except的结构和之前完全一致。
数组的倒序与隔位输出
题目描述
给定一个整数数组,编写一个程序实现以下功能:
- 将输入的整数数组倒序输出,每个数之间用空格分隔。
- 从正序数组中,每隔一个单位(即索引为奇数的元素),输出其值,同样用空格分隔。
输入描述
第一行包含一个整数 n,表示数组的长度。 接下来一行包含 n 个整数,表示数组的元素。
输出描述
首先输出倒序排列的数组元素,然后输出正序数组中每隔一个单位的元素。
输入示例
5 2 3 4 5 6输出示例
6 5 4 3 2 2 4 6我的思路
这题分两个小需求:倒序输出、按步长 2 隔位输出。本质都是按指定规则遍历数组索引,刚好可以练 range 的步长用法,以及空格分隔的输出技巧。 这道题我正式用上了map来读取数组,也第一次用到了负步长的 range。
我的代码
n = input() nums = list(map(int, input().split())) # 倒序输出 for i in range(int(n) - 1, -1 ,-1): print(nums[i], end=' ') print() # 隔位输出(索引0,2,4...) for j in range(0, int(n), 2): print(nums[j], end=' ')重点知识点精讲:map 函数
map是处理算法题输入的神器,必须吃透:
nums = list(map(int, input().split()))它的执行流程分三步:
input().split()读取一行输入,按空格切成字符串列表,比如['2','3','4','5','6']map(int, 列表)把列表里的每个元素都执行一次int()转换,得到一个迭代器- 外面套
list(),把迭代器转成真正的整数列表[2, 3, 4, 5, 6]
一句话总结:批量把字符串转成整数列表的标准写法,比手动循环转 int 简洁太多。
重点知识点:range 的负步长
倒序遍历的关键是这行:
range(int(n) - 1, -1, -1)range 三个参数分别是:起始值、结束值(不包含)、步长。
- 从最后一个元素的索引
n-1开始 - 到
-1结束(不包含 -1,也就是刚好遍历到索引 0) - 步长为 -1,每次索引减 1 这样就能从后往前完整遍历所有元素。
重点知识点:print 的 end 参数
默认print()输出完会自动换行,加上end=' '就会改成用空格结尾,不换行。这样循环输出多个数字时,就能让它们都在同一行,用空格隔开。 注意遍历完一行后,要补一个空的print()来换行,不然下一行内容会接在后面。
扩展:更简洁的切片写法
Python 里还有更偷懒的写法,直接用列表切片:
print(' '.join(map(str, nums[::-1]))) print(' '.join(map(str, nums[::2])))[::-1]:整个列表直接倒序[::2]:步长为 2 取元素- 再用
' '.join()把所有元素用空格拼成字符串输出 刚入门可以先把循环写法搞扎实,切片作为技巧记下来就行。
本题核心知识点
map函数:批量类型转换,算法题输入必备技能。range完整用法:正序、指定起点、负步长倒序、固定步长隔位取。print(end=' '):控制输出不换行,实现空格分隔。- 列表切片基础:
[起始:结束:步长]的通用规则。
第 8 题:摆平积木
题目描述
小明很喜欢玩积木。一天,他把许多积木块组成了好多高度不同的堆,每一堆都是一个摞一个的形式。然而此时,他又想把这些积木堆变成高度相同的。但是他很懒,他想移动最少的积木块来实现这一目标,你能帮助他吗?
输入描述
输入包含多组测试样例。每组测试样例包含一个正整数 n,表示小明已经堆好的积木堆的个数。 接着下一行是 n 个正整数,表示每一个积木堆的高度 h,每块积木高度为 1。其中 1<=n<=50,1<=h<=100。 测试数据保证积木总数能被积木堆数整除。 当 n=0 时,输入结束。
输出描述
对于每一组数据,输出将积木堆变成相同高度需要移动的最少积木块的数量。 在每组输出结果的下面都输出一个空行。
输入示例
6 5 2 4 1 7 5 0输出示例
5我的思路
这是一道很经典的入门应用题,别被题目描述唬住,想明白数学逻辑就非常简单。 核心推理:
- 积木总数是固定的,要让所有堆高度相同,目标高度就是「总积木数 ÷ 堆数」的平均值。
- 求最少移动次数,不需要模拟具体怎么移动 ——只需要把所有高于平均值的部分加起来就是答案。因为高堆移出去的积木数量,刚好等于低堆需要补的数量,算一边就够了。
比如示例里:总积木 5+2+4+1+7+5 = 24,共 6 堆,平均高度 4。 高于 4 的堆:5(差 1)、7(差 3)、5(差 1),总和 1+3+1 = 5,就是最终结果。
我的代码
while 1: try: num = int(input()) nums = list(map(int,input().split())) sum = 0 for i in range(len(nums)): sum += nums[i] avg = sum / num total = 0 for j in range(len(nums)): if nums[j] > avg: total += (nums[j] - avg) print(int(total)) print() except EOFError: break简化写法
用内置的sum函数代替手动循环累加,代码更简洁也不容易写错:
while True: try: n = int(input()) if n == 0: break heights = list(map(int, input().split())) avg = sum(heights) // n move = 0 for h in heights: if h > avg: move += h - avg print(move) print() except EOFError: break这里用整除//更合适,题目保证总数能被整除,结果一定是整数。
本题核心知识点
- 应用题拆解思路:先找数学规律,把问题转化成计算问题,不要上来就暴力模拟移动过程。
sum函数:直接对列表求和,替代手动循环累加,简洁高效。- 多组输入 + 结束标志:n=0 终止、每组输出后空行,格式控制复用之前的经验。
本节知识总结
这一节刷下来,在之前的基础上又补了好几个实用工具,入门级的输入输出和数组操作基本就摸透了。这里整理成本节的复习要点。
1. 输入处理进阶:map 批量转换
一行整数读取万能模板:
nums = list(map(int, input().split()))这行代码以后会天天用,记住它的执行逻辑:读取 → 分割 → 批量转整数 → 存为列表。
2. range 的完整用法
表格
| 写法 | 效果 | 适用场景 |
|---|---|---|
range(n) | 生成 0 到 n-1,步长 1 | 循环执行 n 次 |
range(start, end) | 生成 start 到 end-1,步长 1 | 指定起始范围遍历 |
range(start, end, step) | 按指定步长生成序列 | 隔位输出、倒序遍历 |
重点记两个常用写法:
- 倒序:
range(n-1, -1, -1) - 隔位取偶数索引:
range(0, n, 2)
3. 输出格式控制
print(end=' '):输出后不换行,用空格结尾,适合同一行输出多个元素。- 分隔符通用技巧:「非最后一项才输出分隔符」,避免末尾多出多余的空格、空行。
4. 列表基础操作
- 切片
nums[1:]:从索引 1 取到末尾。 - 倒序切片
nums[::-1]:快速得到倒序的新列表。 - 步长切片
nums[::2]:按步长 2 取元素。
5. 简单应用题思路
先提炼数学规律,再动手写代码,不要被题目场景带偏。比如摆平积木,核心就是算平均值 + 累加高出部分,想通了几行代码就能解决。
这一节下来,基础输入输出和数组遍历基本没问题了。接下来继续往下刷,慢慢接触更复杂的数组操作和基础算法。