每日一题——牛奶桶

180 阅读1分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第12天,点击查看活动详情

题目描述

农夫约翰收到了一份牛奶订单,订购 M 单位的牛奶。

不幸的是,他的挤奶机刚刚坏掉了。

他只有三个桶,容积分别为 X,Y,M(1≤X<Y<M)。

三个桶最初都是空的。

使用这三个桶,他可以执行以下两种类型的操作任意次数:

  1. 将最小的桶(容积为 X 的)装满牛奶,再将其中的牛奶全部倒入容积为 M 的桶中,前提是这不会导致容积为 M 的桶溢出牛奶。
  2. 将中号的桶(容积为 Y 的)装满牛奶,再将其中的牛奶全部倒入容积为 M 的桶中,前提是这不会导致容积为 M 的桶溢出牛奶。

虽然,约翰意识到他可能无法装满容积为 M 的桶,但请帮助他确定他可以添加到这个桶中的最大牛奶量。

输入格式

共一行,包含三个整数 X,Y,M。

输出格式

输出约翰可以添加到容积为 M 的桶中的最大牛奶量。

数据范围

1≤M≤1000, 1≤X<Y<M

输入样例

17 25 77

输出样例

76

样例解释

在此样例中,约翰可将容积为 17 的桶装满 3 次倒入大桶中,将容积为 25 的桶装满 1 次倒入大桶中,总共添加了 76 单位牛奶。

思路

这道题目的意思是,求一个正整数a、b使得ax + by <= m。我们可以使用模拟的思路,模拟每一种情况,由于数

据范围较小,所以可以直接循环枚举a、b。

注意: 时间复杂度最坏情况为O(m^2);

代码

#include <iostream>
#include <cstring>using namespace std;
​
const int N = 1000;
​
int q[10];
int res = 0;
int w;
​
int main()
{   
    int x, y, m;
    cin >> x >> y >> m;
    // 可以0桶或者任意,但是总容量小于桶容量
    for(int i = 0;i * x <= m;i ++)
        for(int j = 0;i * x + j * y <= m;j ++)
            res = max(res, i * x + j * y);
    
    cout << res << endl;
    return 0;
}