1 条题解
-
0
星港回执 题解
题意与关键信息
- 给定函数
- 输入若干行 (,以 结束),询问数不超过 ,对每个 输出 。
从暴力到正解
朴素递归(,40 分)
按定义直接写递归:
int f(int x) { if (x >= 101) return x - 10; return f(f(x + 11)); }当 时,内层 的参数不超过 ,递归深度很浅,直接模拟即可。但当 接近 时,例如 ,内层参数会先跳到 以上再回落,递归过程并不直观——这一档考察的是"照抄定义"的准确性与对递归结构的耐心展开。
关键观察(无限制,正解)
先看几个关键值:
对 :
而 已落在 分支,故 。
- 若 (即 ),则 。
- 若 ,还需要 ,而 仍属于 。
由 向上归纳:,,……得到
再向下归纳:若 ,则 。只要 就继续套用上面的结论,最终得到
(这正是经典的 McCarthy 91 函数。)
正解
对每个询问 回答:
cout << (x >= 101 ? x - 10 : 91) << '\n';复杂度
- 每个询问 ,总时间复杂度 ,空间 ,其中 为询问总数()。
易错点
- 结束标记:读入遇到 立即停止, 本身不产生输出。
- 不是 :只有 才直接减 ; 的答案是 而非 。
- 递归写法可能栈溢出:若把递归写成"先算内层再套外层",对任意 深度都很浅;但若实现有误(例如忘记 的两层调用)会得到错误结果。
- 大数据量输入输出:询问数可达 ,务必使用快速 IO(
ios::sync_with_stdio(false)或getchar手写读入)。
参考代码
见
summercspj262A.cpp。
- 1
信息
- ID
- 252
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 2
- 标签
- 递交数
- 100
- 已通过
- 19
- 上传者