ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

洛谷 P9748 [CSP-J 2023] 小苹果 c++语言

洛谷 P9748 [CSP-J 2023] 小苹果 c++语言 老规矩 题目奉上这次的题目有些长 不过无伤大雅题目大意桌子上有 n 个苹果编号 \(1\sim n\)排成一列。 每一天操作规则从最左边第 1 个苹果开始每隔 2 个拿走 1 个苹果。也就是取第 1、4、7…… 位置上的苹果位置从 1 开始数每 3 个里拿第 1 个。拿完之后剩下苹果保持原有顺序重新排成一列进入下一天。求两个答案拿完全部苹果一共需要多少天原始编号为 n 的苹果会在第几天被拿走。样例输入 8输出5 5。 意思一共要 5 天拿完8 号苹果在第 5 天被拿走。拿苹果规则拆解每隔 2 个拿 1 个 位置序列12345678 第一天拿位置1,4,7剩下2,3,5,6,8这就是新一轮的序列。每天拿走的数量计算公式在代码里等价于take(n2)/3整数除法实现向上取整 剩余苹果数量n n - take思路分析总天数计算循环模拟每一天每天算出当天拿走多少苹果更新剩余苹果数量天数 1直到苹果数量为 0days就是总天数。编号 n 的苹果在哪一天被拿走我们关心原始最末尾的苹果它什么时候会被选中。 观察规律在一轮序列中如果当前序列长度模 3 等于 1本轮第一个位置就是会被拿走的位置。而原始 n 号苹果只有当它处于当前序列的第 1 位时才会被拿走。注意边界n 1第一天就拿走答案1 1。C 完整代码#includebits/stdc.h using namespace std; typedef long long LL; int main() { LL n, days 0, nday 0, take 0; cin n; if (n 1) { cout 1 1 endl; } bool falg false; while (n 0) { days; if (!falg n % 3 1) { nday days; falg true; } take (n (3 - 1)) / 3; n n - take; } cout days nday endl; return 0; }小结这道题核心两点用数学式子(n2)/3快速求每天拿走苹果的数量不用数组模拟每一个苹果效率很高。找到末尾苹果被取走的条件当当前序列长度模 3 等于 1就是目标苹果被拿走的那一天。拓展思考如果直接开数组保存苹果编号模拟n 大的时候会超时这种数学推导的方法更适合大数据。世间万象 纸上一隅 愿这些文字能带给你片刻启发 山高水远 我们后会有期
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进