当前位置:首页 > 比赛题解 > 2023年CSP-J小苹果(洛谷P9748):如何用数学思维解题

2023年CSP-J小苹果(洛谷P9748):如何用数学思维解题

2天前比赛题解53

截图未命名.jpg 2023年CSP-J小苹果(洛谷P9748):如何用数学思维解题 CSP-J 数学问题 小苹果 算法竞赛 入门组 洛谷题解 C++ 第1张

一、问题背景

题目描述有n个苹果排成一列,每天按特定规则取苹果:第一个取走1号苹果,之后每隔2个取1个(即取走4,7,10...号苹果)。需要计算两个结果:1) 所有苹果被取完的天数 2) 编号为n的苹果是在第几天被取走的。

二、算法思路

本题的解题关键在于发现取苹果的数学规律:

  1. 每天取走的苹果数量遵循:(剩余苹果数-1)/3 +1

  2. 第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;
}

四、关键点解析

  1. 循环终止条件:当剩余苹果数n>0时继续循环

  2. 每日取果计算:使用(n-1)/3+1确保整数除法结果正确

  3. 特殊位置判定:通过(n-1)%3==0判断是否轮到最后一个苹果


原创内容 转载请注明出处

分享给朋友:

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。