题解:洛谷 P1421 小玉买文具
【题目来源】
【题目描述】
班主任给小玉一个任务,到文具店里买尽量多的签字笔。已知一只签字笔的价格是 \(1\) 元 \(9\) 角,而班主任给小玉的钱是 \(a\) 元 \(b\) 角,小玉想知道,她最多能买多少只签字笔呢。
【输入】
输入只有一行两个整数,分别表示 \(a\) 和 \(b\)。
【输出】
输出一行一个整数,表示小玉最多能买多少只签字笔。
【输入样例】
10 3
【输出样例】
5
【核心思想】
-
问题分析:已知签字笔单价为 \(1\) 元 \(9\) 角(即 \(19\) 角),小玉有 \(a\) 元 \(b\) 角。求最多能买多少只签字笔。这是一个单位统一 + 整数除法问题。
-
算法选择:
- 统一单位为角:将总金额和单价都转换为"角",避免浮点数精度问题
- 整数除法:总金额除以单价,自动向下取整得到最大购买数量
-
关键步骤:
- 读入数据:
cin >> a >> b读取 \(a\) 元 \(b\) 角 - 单位转换:
mon = a * 10 + b,将元角混合表示统一转换为总角数 - 计算数量:
ans = mon / 19,整数除法自动向下取整 - 输出结果:
cout << ans
- 读入数据:
-
时间/空间复杂度:
- 时间复杂度:\(O(1)\),单次乘法和除法
- 空间复杂度:\(O(1)\),仅需常数个变量
-
整数运算的核心思想:
- 避免浮点精度:以"元"为单位会涉及小数(\(1.9\) 元),浮点数除法可能产生精度误差;转换为"角"后全部变为整数,计算精确
- 向下取整自然性:整数除法自动截断小数部分,恰好对应"最多能买多少只"(剩余钱不够买一只则舍弃)
- 单位换算策略:将复合单位(元+角)统一为最小单位(角),简化计算模型
- 适用于货币计算、单位换算、避免浮点误差类入门问题
【算法标签】
入门 #模拟
【代码详解】
#include <bits/stdc++.h> // 包含标准库头文件(万能头文件)
using namespace std; // 使用标准命名空间
/**
* 主函数 - 程序入口
* @return 程序执行状态码(0表示成功)
*/
int main()
{
int a, b; // 定义变量:a元b角
int ans; // 定义变量:计算结果
cin >> a >> b; // 输入金额(元 角)
// 方法一(注释掉的原始方案):以元为单位计算
// double mon = a + b/10.0; // 将输入转换为元(如1元5角→1.5元)
// ans = mon / 1.9; // 计算可以购买的笔记本数量(1.9元/本)
// 方法二(实际采用的方案):以角为单位计算
int mon = a * 10 + b; // 将输入全部转换为角(如1元5角→15角)
ans = mon / 19; // 计算可以购买的笔记本数量(19角/本)
cout << ans; // 输出计算结果
return 0; // 返回程序执行成功状态码
}
【运行结果】
10 3
5
浙公网安备 33010602011771号