解题思路

这是一个配比问题,需要根据各种原料的配比和容量限制,计算最大可制作的饮料量。

关键点:

  1. 对于每种原料 ,实际使用量应该是:配比 * 是一个系数)
  2. 所有原料的使用量不能超过各自拥有的量
  3. 所有原料的总体积不能超过容器容积
  4. 需要找到最大的

算法步骤:

  1. 对于每种原料,计算 (表示该原料能支持的最大系数)
  2. 找到所有原料中的最小系数,这就是限制因素
  3. 检查在这个系数下总体积是否超过容器容积
  4. 如果超过容器容积,需要进行相应调整

代码

#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))

算法及复杂度

  • 算法:贪心算法
  • 时间复杂度:,其中 是原料的种类数
  • 空间复杂度:,用于存储原料的配比和数量