Leftover Recipes(atcoder.jp)

本文介绍了如何通过两种方法解决材料分配问题,一种是暴力枚举,另一种是先计算A和B的最大利用率,然后进行优化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原题再现

题意

        有N种材料,A,B物品需要这N种材料做菜,求最多可以做多少盆菜


方法一

计算A,B最多可以做食物的数量,暴力枚举

O(10^6*10^6*10)

#pragma GCC optimize(2)
#include <bits/stdc++.h>
#define int long long
using namespace std;
int n;
int q[20], a[20], b[20];
int u[20];
int ans;
bool pd() {
	for (int i = 1; i <= n; i++) {
		if (q[i] < u[i])
			return 0;
	}
	return 1;
}
main() {
	cin >> n;
	for (int i = 1; i <= n; i++) cin >> q[i];
	for (int i = 1; i <= n; i++) cin >> a[i];
	for (int i = 1; i <= n; i++) cin >> b[i];//输入
	int x = 0x3f3f3f3f, y = 0x3f3f3f3f;
	for (int i = 1; i <= n; i++) {
		if (b[i] != 0 && a[i] != 0 && q[i] / a[i] != 0 && q[i] / b[i] != 0)
				x = min(q[i] / a[i], x),y = min(q[i] / b[i], y);
		if (x > 0 && y > 0)
			break;//计算A,B可做菜的最大值
	}
//	cout << x << " " << y;
	for (int i = 1; i <= x; i++) {//暴力枚举
		for (int j = 1; j <= y; j++) {//暴力枚举
//			cout << i << " " << j << endl;
			for (int k = 1; k <= n; k++)//暴力枚举
				u[k] += a[k] * i + b[k] * j;
			if (pd()) {//判断
				ans = max(ans, i + j);
			} else {
				break;//可以加快运行速度?
			}
		}
	}
	cout << ans;
	return 0;
}
方法一(正解)

计算A最多可以做食物的数量,循环计算出B最多可以做食物的数量

最差O(10^6*10)

#include <bits/stdc++.h>
using namespace std;
int n;
int q[50], a[50], b[50], u[50];
int ans;
int aa = 0x3f3f3f3f, bb;
int main() {
	cin >> n;
	for (int i = 1; i <= n; i++)
		cin >> q[i];//输入
	for (int i = 1; i <= n; i++) {
		cin >> a[i];
		if (a[i] != 0 && q[i] / a[i] < aa) {
			aa = q[i] / a[i];//计算A最多可以做食物的数量
		}
	}
	for (int i = 1; i <= n; i++)
		cin >> b[i];
	for (int i = 0; i <= aa; i++) {
		bb = 0x3f3f3f3f;//初始化bb
		for (int j = 1; j <= n; j++)
			if (b[j] != 0 && bb > ((q[j] - (a[j]*i)) / b[j]))
				bb = (q[j] - (a[j] * i)) / b[j];//循环计算出B最多可以做食物的数量
		ans = max(ans, i + bb);//求ans
	}
	cout << ans;
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值