PPC 新手上手操作指南¶
PPC 题通常不是考某个固定工具,而是考你能不能把题面规则转成程序。关键是先读懂输入输出格式和数据范围,再决定暴力、模拟、搜索、数学化或动态规划。
这类题先看什么¶
先确认:
- 输入是什么格式?一组数据、多组数据、交互式还是远程服务?
- 输出要求是什么?单个答案、每轮回复、最终提交 token?
- 数据范围多大?能不能暴力?是否需要优化?
- 样例能不能手算复现?
- 是否有模运算、图、字符串、排序、搜索或随机过程?
最小工具集¶
| 工具 | 用途 |
|---|---|
| Python | 快速写解析、模拟、搜索脚本 |
pwntools |
连接远程交互服务 |
itertools / collections |
暴力、组合、计数、队列 |
sympy |
数学公式、同余、矩阵、方程辅助 |
| 本地样例 | 验证算法和边界条件 |
首轮 10 分钟操作流程¶
Step 1:重写题面规则¶
把题面翻译成三句话:
输入是什么?
我要输出什么?
数据范围允许什么复杂度?
如果这三句话写不出来,不要急着写代码。
Step 2:手算样例¶
先手算最小样例,确认你理解了规则。PPC 题很多错误不是代码写错,而是题意理解偏了。
Step 3:估算复杂度¶
| 数据范围 | 常见可行策略 |
|---|---|
n <= 20 |
暴力、位枚举、回溯 |
n <= 10^3 |
O(n^2) 可能可行 |
n <= 10^5 |
排序、哈希、前缀、线性/O(n log n) |
| 大整数/同余 | 数学化、扩展欧几里得、CRT |
| 图/迷宫 | BFS、DFS、Dijkstra、状态压缩 |
Step 4:先写清晰脚本,再优化¶
先写一个能过小样例的版本,再根据数据范围优化。不要一开始就写复杂模板。
典型突破口¶
- 模运算方程:考虑 gcd、逆元、CRT。
- 迷宫/路径:考虑 BFS,状态里是否需要带钥匙、方向、步数。
- 多轮交互:先写稳定的收发函数,别把解析逻辑散在各处。
- 随机/游戏:找周期、状态转移或可预测策略。
- 大量查询:预处理、前缀和、哈希表。
新手常见误区¶
- 没读清输入格式,脚本解析错。
- 没看数据范围,写了不可行暴力。
- 没手算样例,导致方向错还以为是代码 bug。
- 远程交互题没有处理提示文本、换行和超时。
- 只追求一次跑通,没有把脚本整理成可复现版本。
仓库内参考阅读¶
- CPCTF Modulo Equation — 同余/模运算类 PPC。
- CPCTF Sign up for traP — 规则解析与脚本化。
- NovruzCTF Floating in Samani — 数值与脚本验证。
一页式检查清单¶
- 写下了输入、输出、数据范围三句话
- 手算了至少一个小样例
- 估算了复杂度,确认算法可行
- 本地脚本能稳定解析输入
- 远程交互时处理了换行、提示和超时
- 对边界情况做了测试:空、最小、最大、重复、负数
- 保存了最终脚本和运行方式