题解:洛谷 P1421 小玉买文具

【题目来源】

洛谷:P1421 小玉买文具 - 洛谷

【题目描述】

班主任给小玉一个任务,到文具店里买尽量多的签字笔。已知一只签字笔的价格是 \(1\)\(9\) 角,而班主任给小玉的钱是 \(a\)\(b\) 角,小玉想知道,她最多能买多少只签字笔呢。

【输入】

输入只有一行两个整数,分别表示 \(a\)\(b\)

【输出】

输出一行一个整数,表示小玉最多能买多少只签字笔。

【输入样例】

10 3

【输出样例】

5

【核心思想】

  1. 问题分析:已知签字笔单价为 \(1\)\(9\) 角(即 \(19\) 角),小玉有 \(a\)\(b\) 角。求最多能买多少只签字笔。这是一个单位统一 + 整数除法问题。

  2. 算法选择

    • 统一单位为角:将总金额和单价都转换为"角",避免浮点数精度问题
    • 整数除法:总金额除以单价,自动向下取整得到最大购买数量
  3. 关键步骤

    • 读入数据cin >> a >> b 读取 \(a\)\(b\)
    • 单位转换mon = a * 10 + b,将元角混合表示统一转换为总角数
    • 计算数量ans = mon / 19,整数除法自动向下取整
    • 输出结果cout << ans
  4. 时间/空间复杂度

    • 时间复杂度:\(O(1)\),单次乘法和除法
    • 空间复杂度:\(O(1)\),仅需常数个变量
  5. 整数运算的核心思想

    • 避免浮点精度:以"元"为单位会涉及小数(\(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
posted @ 2026-08-05 15:44  团爸讲算法  阅读(32)  评论(0)    收藏  举报