小杨有 (n) 元钱,想购买相同数量的商品 A 和商品 B。商品 A 的单价为 (a) 元,商品 B 的单价为 (b) 元。题目要求计算出他最多能买多少对商品(一对包含一个 A 和一个 B)。
题目本质是:在总金额不超过 (n) 的条件下,求最大的整数 (k),使得 (k \times a + k \times b \le n)。
购买 (k) 个商品 A 和 (k) 个商品 B 的总花费为:
[
k \times (a + b)
]
我们要求这个总花费不超过 (n),即:
[
k \times (a + b) \le n
]
两边同时除以 (a+b)(注意是整数除法,向下取整),可得:
[
k \le \left\lfloor \dfrac{n}{a + b} \right\rfloor
]
因此,最多能购买的商品 A 和 B 的数量就是 (\lfloor \frac{n}{a+b} \rfloor),也就是 C++ 中的 n / (a + b)。
n / (a + b)。由于题目保证 (n, a, b) 在 (1) 到 (10^5) 之间,使用 int 类型即可安全存储和计算。
整个算法只进行了常数次运算,因此时间复杂度为 (O(1)),空间复杂度也为 (O(1)),可以高效通过本题。
题目已经提供了 C++ 参考代码,下面给出详细解释:
cpp1#include<bits/stdc++.h> 2using namespace std; 3int main(){ 4 int n, a, b; 5 cin >> n >> a >> b; // 读入总金额和两个单价 6 cout << n / (a + b) << "\n"; // 计算并输出最多能买的对数 7 return 0; 8}
代码说明:
main 函数,程序入口。n / (a + b),即花完钱能买的最大整数对数,并输出结果。