原题再现
题意
有N种材料,A,B物品需要这N种材料做菜,求最多可以做多少盆菜
方法一
计算A,B最多可以做食物的数量,暴力枚举
O()
#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()
#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;
}