文章

【GESP】C++二级模拟 luogu-p1150, Peter 的烟

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

luogu-P1150 Peter 的烟

题目要求

题目描述

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

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

输入格式

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

输出格式

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

样例输入 #1

1
4 3

样例输出 #1

1
5

样例输入 #2

1
10 3

样例输出 #2

1
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类型避免溢出

示例代码

示例一

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#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;
}

示例二:

我儿子的脑回路

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#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. 不要忘记考虑剩余烟蒂不足以换新烟的情况

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

GESP各级别考纲要点、知识拓展和练习题目清单详见C++学习项目主页

luogu-”系列题目已加入洛谷Java、C++初学团队作业清单,可在线评测,团队名额有限,欢迎加入。

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

本文由作者按照 CC BY 4.0 进行授权