题解:洛谷 B4257 图书馆里的老鼠
【题目来源】
洛谷:B4257 [GESP202503 一级] 图书馆里的老鼠 - 洛谷(luogu.com.cn)
【题目描述】
图书馆里有 \(n\) 本书,不幸的是,还混入了一只老鼠,老鼠每 \(x\) 小时能啃光一本书,假设老鼠在啃光一本书之前,不会啃另一本。请问 \(y\) 小时后图书馆里还剩下多少本完整的书。
【输入】
三行,第一行一个正整数 \(n\),表示图书馆里书的数量;
第二行,一个正整数 \(x\),表示老鼠啃光一本书需要的时间;
第三行,一个正整数 \(y\),表示经过的总时间;
输入数据保证 \(y\) 小时后至少会剩下一本完整的书。
【输出】
一行,一个整数,表示 \(y\) 小时后图书馆里还剩下多少本完整的书。
【输入样例】
10
2
3
【输出样例】
8
【核心思想】
-
问题分析:图书馆有 \(n\) 本书,老鼠每 \(x\) 小时啃光一本书,\(y\) 小时后求剩余完整书的数量。这是一个整数除法与余数问题,核心在于计算 \(y\) 小时内老鼠能完整啃完多少本书。
-
算法选择:
- 整数除法:\(y / x\) 得到完整啃完的书数,余数判断是否有正在啃的书
-
关键步骤:
- 读入数据:读取 \(n, x, y\)
- 计算被啃书数:
- 若 \(y \bmod x = 0\):老鼠刚好啃完 \(y/x\) 本书,正在啃第 \(y/x + 1\) 本但尚未啃完,剩余 \(n - y/x\)
- 若 \(y \bmod x \neq 0\):老鼠正在啃第 \(\lfloor y/x \rfloor + 1\) 本书且已啃了一部分,这本书不完整,剩余 \(n - \lfloor y/x \rfloor - 1\)
- 输出结果:剩余书数
-
时间/空间复杂度:
- 时间复杂度:\(O(1)\)
- 空间复杂度:\(O(1)\)
-
整数除法的核心思想:
- 完整周期与余数分析:\(y\) 小时内包含 \(\lfloor y/x \rfloor\) 个完整的 \(x\) 小时周期,老鼠能完整啃完 \(\lfloor y/x \rfloor\) 本书。余数 \(y \bmod x\) 决定当前是否正在啃下一本书
- 边界条件处理:当 \(y\) 恰好是 \(x\) 的倍数时,老鼠刚好完成一本书的啃食,即将开始下一本但尚未动手,因此这本不算被啃;有余数时,当前这本正在被啃,不算完整
- 题目保证的简化:题目保证至少剩一本书,无需处理 \(n\) 不足的特殊情况
- 适用于周期事件计数、整数除法取整类基础问题
【算法标签】
入门 #数学
【代码详解】
#include <bits/stdc++.h>
using namespace std;
int n, x, y; // n: 总数,x: 每个单位的大小,y: 目标总量
int main() {
cin >> n >> x >> y; // 输入n, x, y
if (y % x == 0) { // 如果y能被x整除
cout << n - y / x << endl; // 输出剩余的数量
} else { // 如果y不能被x整除
cout << n - y / x - 1 << endl; // 输出剩余的数量减1
}
return 0;
}
【运行结果】
10
2
3
8
浙公网安备 33010602011771号