题解
买钢笔
1 条题解
-
0
解题思路
班费要刚好花完,还要买尽量多的笔。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