算法题(水果拼盘)

189 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第30天,点击查看活动详情

题目信息描述

某水果店以出售水果拼盘盈利。

该店铺共提供两种拼盘:

  • 拼盘 11:包含 11 个苹果,11 个香蕉。
  • 拼盘 22:包含 11 个梨,11 个橙子,11 个香蕉。

已知该店铺共有 aa 个苹果,bb 个梨,cc 个橙子,dd 个香蕉。

拼盘 11 的利润为 ee 元,拼盘 22 的利润为 ff 元。

水果店的生意很好,所有拼好的拼盘都会销售一空。

请问,利用现有水果拼装水果拼盘,能够获得的最大利润是多少?

注意,也许会有一些水果用不完,但这并不重要。

输入格式

第一行包含整数 TT,表示共有 TT 组测试数据。

每组数据占一行,包含 66 个整数,依次为 a,b,c,d,e,fa,b,c,d,e,f。

输出格式

每组数据输出一行结果,表示最大利润。

数据范围

1≤T≤101≤T≤10。 1≤a,b,c,d≤1051≤a,b,c,d≤105, 1≤e,f≤1031≤e,f≤103。

输入样例:

3
4 5 6 3 1 2
12 11 13 20 4 6
17 14 5 21 15 17

输出样例:

6
102
325

思路

这道题其实就是一个模拟。假如套餐 1 比套餐 2 利润大,那么肯定优先选择套餐 1,而反之亦然。一个套餐肯定要先尽可能买完,这是我们把需要的水果里面取一个最小值就可以了。

这里教给大家一个小小的技巧:min({a, b, c, d...}) 这样的格式可以快速取最小值,max 也可以用这样的方式取最大值。

贪心思路

  • 两个拼盘冲突的水果是香蕉,所以优先让尽可能多的香蕉加入利润更高的拼盘。
  • 不妨设 e≥fe≥f,那么我们优先组成拼盘 11。拼盘 11 的最大数量是苹果和香蕉的较小值 min(a,d)min(a,d),那么剩余香蕉的数量即为 d−min(a,d)d−min(a,d),用这些香蕉(可能已经为 00)去组成拼盘 22,类似的,拼盘 22 的最大数量是梨、橙子和香蕉数量的最小值 min(b,c,d)min(b,c,d),将这两个拼盘的总利润相加即可。 e<fe<f 的情况同理。

代码

#include <bits/stdc++.h>
using namespace std;
void solve() {
    int a, b, c, d, e, f, ans = 0;
    cin >> a >> b >> c >> d >> e >> f;
    if(e > f) {
        ans += (min(a, d) * e);
        int tmp = min(a, d);
        a -= tmp, d -= tmp;
        ans += (min({b, c, d}) * f);
    } else {
        ans += (min({b, c, d}) * f);
        int tmp = min({b, c, d});
        b -= tmp, c -= tmp, d -= tmp;
        ans += (min(a, d) * e);
    } cout << ans << endl;
}
int main() {
    int t;
    cin >> t;
    while(t --) solve();
}
​
​