题目
题目链接
解题思路
这是一个配比问题,需要根据各种原料的配比和容量限制,计算最大可制作的饮料量。
关键点:
- 对于每种原料 \(i\),实际使用量应该是:配比 \(a_i\) * \(x\)(\(x\) 是一个系数)
- 所有原料的使用量不能超过各自拥有的量 \(b_i\)
- 所有原料的总体积不能超过容器容积 \(v\)
- 需要找到最大的 \(x\) 值
算法步骤:
- 对于每种原料,计算 \(b_i / a_i\)(表示该原料能支持的最大系数)
- 找到所有原料中的最小系数,这就是限制因素
- 检查在这个系数下总体积是否超过容器容积
- 如果超过容器容积,需要进行相应调整
代码
#include <bits/stdc++.h>
using namespace std;int main() {int n, v;cin >> n >> v;vector<int> a(n), b(n);for (int i = 0; i < n; i++) cin >> a[i];for (int i = 0; i < n; i++) cin >> b[i];// 计算每种原料支持的最大系数double minRatio = 1e9;for (int i = 0; i < n; i++) {if (a[i] > 0) {minRatio = min(minRatio, (double)b[i] / a[i]);}}// 计算在最小系数下的总体积double totalVolume = 0;for (int i = 0; i < n; i++) {totalVolume += a[i] * minRatio;}// 如果超过容器容积,需要调整if (totalVolume > v) {minRatio = minRatio * v / totalVolume;}// 输出结果,保留4位小数printf("%.4f\n", minRatio * accumulate(a.begin(), a.end(), 0));return 0;
}
import java.util.*;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();int v = sc.nextInt();int[] a = new int[n];int[] b = new int[n];for (int i = 0; i < n; i++) a[i] = sc.nextInt();for (int i = 0; i < n; i++) b[i] = sc.nextInt();// 计算每种原料支持的最大系数double minRatio = 1e9;for (int i = 0; i < n; i++) {if (a[i] > 0) {minRatio = Math.min(minRatio, (double)b[i] / a[i]);}}// 计算在最小系数下的总体积double totalVolume = 0;for (int i = 0; i < n; i++) {totalVolume += a[i] * minRatio;}// 如果超过容器容积,需要调整if (totalVolume > v) {minRatio = minRatio * v / totalVolume;}// 计算最终结果double result = 0;for (int i = 0; i < n; i++) {result += a[i] * minRatio;}// 输出结果,保留4位小数System.out.printf("%.4f\n", result);sc.close();}
}
n, v = map(int, input().split())
a = list(map(int, input().split()))
b = list(map(int, input().split()))# 计算每种原料支持的最大系数
min_ratio = float('inf')
for i in range(n):if a[i] > 0:min_ratio = min(min_ratio, b[i] / a[i])# 计算在最小系数下的总体积
total_volume = sum(a[i] * min_ratio for i in range(n))# 如果超过容器容积,需要调整
if total_volume > v:min_ratio = min_ratio * v / total_volume# 计算最终结果
result = sum(a[i] * min_ratio for i in range(n))# 输出结果,保留4位小数
print("{:.4f}".format(result))
算法及复杂度
- 算法:贪心算法
- 时间复杂度:\(\mathcal{O(n)}\),其中 \(n\) 是原料的种类数
- 空间复杂度:\(\mathcal{O(n)}\),用于存储原料的配比和数量