持续创作,加速成长!这是我参与「掘金日新计划 · 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();
}