top1编程
← 返回题目
题解

【入门】买糕点

1 条题解

  • 0
    @ 2026-7-31 10:06:58

    解题思路

    题目要求用 n 元买面包(x 元/件)和蛋挞(y 元/件),两种都要买,钱要正好花完,还要让面包最多。

    怎么找面包最多的方案?

    面包买得越多越好,所以从面包最多的可能开始试:

    1. 面包最多能买 n÷x 件(再多了钱就不够买蛋挞了)
    2. 从这么多件开始,一件一件往下减
    3. 每试一个面包数 m,看剩下的钱 n-m×x 能不能正好买整数件蛋挞(也就是能被 y 整除)
    4. 能整除,而且蛋挞至少 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