Peter 的烟

GESP二级模拟题,难度★✮☆☆☆。本题考察简单循环和数学逻辑思维。

luogu-P1150 Peter 的烟

题目要求

题目描述

Peter 有 nn 根烟,他每吸完一根烟就把烟蒂保存起来,kkk>1k>1)个烟蒂可以换一个新的烟,那么 Peter 最终能吸到多少根烟呢?

与某些脑筋急转弯不同的是,Peter 并不能从异次元借到烟蒂,抽完后再还回去。

输入格式

每组测试数据一行包括两个整数 n,kn, k1<n,k1081 < n, k \le 10^8)。

输出格式

对于每组测试数据,输出一行包括一个整数表示最终烟的根数。

样例输入 #1

4 3

样例输出 #1

5

样例输入 #2

10 3

样例输出 #2

14

题目分析

解题思路

  1. 首先,Peter 可以抽掉初始的 n 根烟
  2. 每抽完一根烟会得到一个烟蒂
  3. 当积累了 k 个烟蒂时,可以换一根新烟
  4. 新烟抽完后又会产生烟蒂,继续参与换烟
  5. 这是一个循环的过程,直到剩余的烟蒂数量少于 k 个为止

举例说明(以样例1为例)

  • 初始有4根烟
  • 抽完4根烟后有4个烟蒂
  • 4个烟蒂可以换1根新烟(还剩1个烟蒂)
  • 这1根新烟抽完后得到1个烟蒂,现在共2个烟蒂
  • 2个烟蒂不够换新烟(k=3)
  • 所以总共抽了5根烟(4+1=5)

代码实现要点:

  1. 使用循环来模拟换烟的过程
  2. 需要记录已经抽过的烟的数量和当前剩余的烟蒂数量
  3. 注意数据范围,使用long long类型避免溢出

示例代码

示例一

#include <iostream>
using namespace std;

int main() {
    long long n, k;
    cin >> n >> k;
    
    long long total = n;  // 总共抽的烟数
    long long butts = n;  // 当前的烟蒂数
    
    while (butts >= k) {
        long long new_cigs = butts / k;  // 可以换到的新烟数
        total += new_cigs;  // 加入到总数中
        butts = butts % k + new_cigs;  // 更新烟蒂数:未换的 + 新抽的
    }
    
    cout << total << endl;
    return 0;
}

示例二:

我儿子的脑回路

#include <iostream>
using namespace std;
int main() {
    long long n, k; // 定义两个长整型变量n和k
    cin >> n >> k; // 从标准输入流中读取n和k的值
    long long ans = 0; // 定义一个长整型变量ans,初始化为0,用于存储答案
    for (long long i = 1; i <= n; i++) { // 从1开始循环,直到i不大于n
        if (i % k == 0) { // 如果i能够被k整除
            n++; // 增加n的值
        }
        ans += 1; // 每次循环都增加ans的值
    }
    cout << ans; // 输出ans的值
    return 0; // 返回0,表示程序正常结束
}

注意事项:

  1. 由于输入数据范围达到10^8,计算过程中可能出现较大的数,因此使用long long类型
  2. 这是一个模拟题,关键是理解题目描述的过程并正确实现
  3. 不要忘记考虑剩余烟蒂不足以换新烟的情况

{% include custom/custom-post-content-footer.md %}

所有代码已上传至Github:https://github.com/lihongzheshuai/yummy-code

luogu-”系列题目可在 洛谷题库 在线评测。

bcqm-”系列题目可在 编程启蒙题库 在线评测。

GESP/CSP 认证学习微信公众号
GESP/CSP 认证学习微信公众号
Last updated on