【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
题目分析
解题思路
- 首先,Peter 可以抽掉初始的 n 根烟
- 每抽完一根烟会得到一个烟蒂
- 当积累了 k 个烟蒂时,可以换一根新烟
- 新烟抽完后又会产生烟蒂,继续参与换烟
- 这是一个循环的过程,直到剩余的烟蒂数量少于 k 个为止
举例说明(以样例1为例):
- 初始有4根烟
- 抽完4根烟后有4个烟蒂
- 4个烟蒂可以换1根新烟(还剩1个烟蒂)
- 这1根新烟抽完后得到1个烟蒂,现在共2个烟蒂
- 2个烟蒂不够换新烟(k=3)
- 所以总共抽了5根烟(4+1=5)
代码实现要点:
- 使用循环来模拟换烟的过程
- 需要记录已经抽过的烟的数量和当前剩余的烟蒂数量
- 注意数据范围,使用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,表示程序正常结束
}
注意事项:
- 由于输入数据范围达到10^8,计算过程中可能出现较大的数,因此使用long long类型
- 这是一个模拟题,关键是理解题目描述的过程并正确实现
- 不要忘记考虑剩余烟蒂不足以换新烟的情况
所有代码已上传至Github:https://github.com/lihongzheshuai/yummy-code
GESP各级别考纲要点、知识拓展和练习题目清单详见C++学习项目主页
“luogu-”系列题目已加入洛谷Java、C++初学团队,作业清单,可在线评测,团队名额有限,欢迎加入。
“bcqm-”系列题目可在编程启蒙题库进行在线评测。
本文由作者按照 CC BY 4.0 进行授权