2023年CSP-J小苹果(洛谷P9748):如何用数学思维解题
一、问题背景
题目描述有n个苹果排成一列,每天按特定规则取苹果:第一个取走1号苹果,之后每隔2个取1个(即取走4,7,10...号苹果)。需要计算两个结果:1) 所有苹果被取完的天数 2) 编号为n的苹果是在第几天被取走的。
二、算法思路
本题的解题关键在于发现取苹果的数学规律:
每天取走的苹果数量遵循:(剩余苹果数-1)/3 +1
第n个苹果被取走的判定条件:(当前苹果数-1)能被3整除
三、完整代码解析(含详细注释)
#include <iostream> using namespace std; int main() { int n; // 苹果总数 cin >> n; int days = 0; // 总天数 int last_day = 0; // 第n个苹果被取走的天数 bool found = false; // 是否已找到第n个苹果 while (n > 0) { days++; // 天数增加 // 检查当前轮次是否取走第n个苹果 if (!found && (n - 1) % 3 == 0) { last_day = days; found = true; } // 计算本轮取走的苹果数:(n-1)/3 + 1 n -= ((n - 1) / 3 + 1); } cout << days << " " << last_day << endl; return 0; }
四、关键点解析
循环终止条件:当剩余苹果数n>0时继续循环
每日取果计算:使用(n-1)/3+1确保整数除法结果正确
特殊位置判定:通过(n-1)%3==0判断是否轮到最后一个苹果
原创内容 转载请注明出处