PIO5 多组_A+B_零尾模式¶
入门通过率 84.4%python3样例通过牛客 AC
讲解章节:输入输出处理
一句话
读到 0 0 这组数据为止,哨兵本身不算一组。
解题思路¶
这题考什么¶
输入形态:多组数据,零尾模式(哨兵结束)。 组数不给,结束标志也不是文件末尾,而是数据流里一个约定的特殊值—— 这里是「a 和 b 同时为 0」的那一组。这种约定俗成的结束标记叫哨兵(sentinel)。
读入仍然用一次性 read().split() 的 token 流范式:哨兵模式下组数未知, 按 token 推进比按行推进更省事,游标 i 每次前进 2 个位置就是下一组。
与 EOF 形态(PIO3)的区别在于终止条件的来源:EOF 由数据耗尽决定, 哨兵由数据内容决定。哨兵之后即使还有内容也不该再处理, 而且哨兵这一组绝对不能计入答案——多输出一个 0 就是答案错误。
为什么循环条件写成 i + 1 < len(data)¶
正常数据一定会在耗尽前碰到哨兵并 break,这个条件本该用不上。 写上它是为了兜底:万一数据末尾缺了哨兵,或者最后一组只剩一个数, 程序会安静地停下来,而不是抛 IndexError 变成运行时错误。
数据规模与复杂度¶
a, b 的下界是 0(前面几题是 1),上界 1e9;组数由数据决定。 时间 O(token 总数),空间 O(答案条数)。
坑在哪¶
- 结束条件必须是 a == 0 and b == 0,两个数同时为 0 才停。 写成 or 会把合法的 0 5 误当成结束标志,后面的数据全部丢失。 本题下界是 0 而不是 1,正是为了让这个错误真的会被数据抓到。
- 游标 i += 2 要放在 break 判断之前还是之后并不影响正确性, 但哨兵那一组的和绝不能 append。判断放在 append 之前是最直接的写法。
- 输出条数未知且可能很多,攒进 out 后一次 write; 逐行 print 在成千上万行时明显更慢。
参考实现¶
[:octicons-arrow-left-16: PIO4](PIO4.md) [PIO6 :octicons-arrow-right-16:](PIO6.md)