二级
C++ 算法考级专栏
真题分析、矩阵探测、递归回溯与基础语法
🎨 视觉封面【GESP】C++二级模拟 luogu-p1150, Peter 的烟
📅 2025-02-07·✍️ OneCoder·计算中...·⏱️ 4 分钟
#GESP#C++#基础语句
GESP二级模拟题,难度★✮☆☆☆。本题考察简单循环和数学逻辑思维。
luogu-P1150 Peter 的烟
题目要求
题目描述
Peter 有 根烟,他每吸完一根烟就把烟蒂保存起来,()个烟蒂可以换一个新的烟,那么 Peter 最终能吸到多少根烟呢?
与某些脑筋急转弯不同的是,Peter 并不能从异次元借到烟蒂,抽完后再还回去。
输入格式
每组测试数据一行包括两个整数 ()。
输出格式
对于每组测试数据,输出一行包括一个整数表示最终烟的根数。
样例输入 #1
BASH
4 3
样例输出 #1
BASH
5
样例输入 #2
BASH
10 3
样例输出 #2
BASH
14
题目分析
解题思路
- 首先,Peter 可以抽掉初始的 n 根烟
- 每抽完一根烟会得到一个烟蒂
- 当积累了 k 个烟蒂时,可以换一根新烟
- 新烟抽完后又会产生烟蒂,继续参与换烟
- 这是一个循环的过程,直到剩余的烟蒂数量少于 k 个为止
举例说明(以样例1为例):
- 初始有4根烟
- 抽完4根烟后有4个烟蒂
- 4个烟蒂可以换1根新烟(还剩1个烟蒂)
- 这1根新烟抽完后得到1个烟蒂,现在共2个烟蒂
- 2个烟蒂不够换新烟(k=3)
- 所以总共抽了5根烟(4+1=5)
代码实现要点:
- 使用循环来模拟换烟的过程
- 需要记录已经抽过的烟的数量和当前剩余的烟蒂数量
- 注意数据范围,使用long long类型避免溢出
示例代码
示例一
CPP
#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;
}
示例二:
我儿子的脑回路
CPP
#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类型
- 这是一个模拟题,关键是理解题目描述的过程并正确实现
- 不要忘记考虑剩余烟蒂不足以换新烟的情况
💡 OneCoder 资源指引
所有代码开源上传至 GitHub:yummy-code 仓库 · GESP 专题站:GESP WIKI
🤝 技术交流与答疑
欢迎加入:C++ GESP/CSP 考级答疑群(688906745) 与 Java/Python交流群(982860385),点击可直接加群。
📚
猜你想读 · 相关文章推荐
OneCoder (lihongzheshuai)
一个中年人的自留地,记录学习 C++、GESP/NOI、Java、Python 与算法架构的心得体会。本站唯一网址:coderli.com
💬 读者留言与交流
还没有留言,快来成为第一个讨论者吧!