题解
【入门】买糕点
1 条题解
-
0
解题思路
题目要求用 n 元买面包(x 元/件)和蛋挞(y 元/件),两种都要买,钱要正好花完,还要让面包最多。
怎么找面包最多的方案?
面包买得越多越好,所以从面包最多的可能开始试:
- 面包最多能买 n÷x 件(再多了钱就不够买蛋挞了)
- 从这么多件开始,一件一件往下减
- 每试一个面包数 m,看剩下的钱 n-m×x 能不能正好买整数件蛋挞(也就是能被 y 整除)
- 能整除,而且蛋挞至少 1 件,就找到了答案
因为是从多到少试的,所以第一个成功的方案就是面包最多的方案。
举个例子:n=100,面包15元,蛋挞10元。
- 面包最多 100÷15=6 件
- 试 6 件面包:剩 100-90=10 元,10÷10=1 件蛋挞,正好 ✅
- 答案就是 6 件面包 1 件蛋挞
参考代码
#include <iostream> using namespace std; int main() { int n, x, y; cin >> n >> x >> y; // 面包最多买 n/x 件,从多到少尝试 for (int m = n / x; m >= 1; m--) { // 剩下的钱买蛋挞,要能花光且至少1件 int left = n - m * x; if (left > 0 && left % y == 0) { cout << m << ' ' << left / y << endl; return 0; } } return 0; }复杂度分析
- 时间复杂度:O(N/X),最多试 n÷x 种面包数
- 空间复杂度:O(1)
- 1