top1编程
← 返回题目
题解

买钢笔

1 条题解

  • 0
    @ 2026-8-4 1:18:03

    解题思路

    班费要刚好花完,还要买尽量多的笔。4 元笔最便宜,同样的钱买 4 元笔数量最多,所以先按全买 4 元笔来算:能买 x/4 支,还剩下 x%4 元。

    剩下的钱不够再买一支 4 元笔了,那怎么办?可以把已经买的部分 4 元笔"升级"成更贵的笔,把余下的钱补上:

    • 余 1 元:把 1 支 4 元笔换成 5 元笔,多花 1 元。
    • 余 2 元:把 1 支 4 元笔换成 6 元笔,多花 2 元。
    • 余 3 元:把 1 支换成 6 元、1 支换成 5 元,一共多花 3 元。
    • 余 0 元:不用换,全买 4 元笔。

    这样笔的总数始终是 x/4 支(最多),而且钱正好花完。

    注意输出顺序:先是 6 元笔的数量,再是 5 元笔的数量,最后是 4 元笔的数量。

    参考代码

    // 用途:用班费 x 元买尽量多的钢笔(6元/5元/4元),不剩钱,输出各种笔的数量
    #include <iostream>
    using namespace std;
    
    int main() {
        int x;
        cin >> x;
        // 4 元笔最便宜,先按全买 4 元笔来算,买得最多
        int a = 0, b = 0, c = x / 4;
        int r = x % 4;   // 剩下的钱不够再买一支,需要把部分 4 元笔"升级"
        if (r == 1) {          // 多 1 元:把 1 支 4 元换成 5 元
            b = 1; c--;
        } else if (r == 2) {   // 多 2 元:把 1 支 4 元换成 6 元
            a = 1; c--;
        } else if (r == 3) {   // 多 3 元:把 1 支换成 6 元、1 支换成 5 元
            a = 1; b = 1; c -= 2;
        }
        cout << a << " " << b << " " << c << endl;
        return 0;
    }
    

    复杂度分析

    程序只做了几次除法、取余和判断,时间复杂度是 O(1),和 x 的大小无关。

    • 1