题目链接
题目描述
讨厌鬼需要采购 种货物,每种货物都至少要购买一件。对于第
种货物,她有两种独立的购买方式:
- 从供应商A处以
元的价格购买。
- 从供应商B处以
元的价格购买。
此外,还有第三种打包购买方式:
3. 在网购平台一次性购买全部 种货物,总花费为
元。
可以自由组合以上方式,求满足每种货物都至少有一件的最小总花费。
解题思路
这是一个典型的决策问题,我们需要在两种主要的采购策略中选择花费更小的一种。
策略一:完全不使用网购平台
在这种策略下,我们完全放弃网购平台的打包优惠。对于需要的每一种货物 (从1到
),我们都必须独立购买。为了使花费最小,我们应该为每种货物选择价格更低的供应商。
- 对于第
种货物,其最低采购成本是
。
- 要买齐所有
种货物,总花费就是将每种货物的最低成本相加。
- 因此,策略一的总花费为:
。
策略二:使用网购平台
网购平台提供了一个“一键购齐”的选项,花费为 元。这个选项不能拆分,要么买全部,要么不买。
最终决策
问题的核心就在于比较这两种策略的总花费。
- 如果我们选择策略一,总花费是
。
- 如果我们选择策略二,总花费是
。
为了实现最小总花费,我们只需要在这两个最终的总花费中选择一个较小的值即可。
- 最小总花费 =
算法步骤
- 读取货物种类数
和网购平台价格
。
- 读取供应商A的
个价格
。
- 读取供应商B的
个价格
。
- 初始化一个变量
sum_of_mins
为 0。 - 遍历从
到
的所有货物,对于每种货物
:
- 计算
。
- 将这个最小值累加到
sum_of_mins
上。
- 计算
- 比较
sum_of_mins
和,输出两者中的较小值。
代码
#include <iostream>
#include <vector>
#include <numeric>
#include <algorithm>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int n;
long long c;
cin >> n >> c;
vector<long long> a(n), b(n);
for (int i = 0; i < n; ++i) cin >> a[i];
for (int i = 0; i < n; ++i) cin >> b[i];
long long sum_of_mins = 0;
for (int i = 0; i < n; ++i) {
sum_of_mins += min(a[i], b[i]);
}
cout << min(sum_of_mins, c) << endl;
return 0;
}
import java.util.Scanner;
import java.lang.Math;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
long c = sc.nextLong();
long[] a = new long[n];
long[] b = new long[n];
for (int i = 0; i < n; i++) a[i] = sc.nextLong();
for (int i = 0; i < n; i++) b[i] = sc.nextLong();
long sumOfMins = 0;
for (int i = 0; i < n; i++) {
sumOfMins += Math.min(a[i], b[i]);
}
System.out.println(Math.min(sumOfMins, c));
}
}
import sys
def solve():
n, c = map(int, sys.stdin.readline().split())
a = list(map(int, sys.stdin.readline().split()))
b = list(map(int, sys.stdin.readline().split()))
sum_of_mins = 0
for i in range(n):
sum_of_mins += min(a[i], b[i])
print(min(sum_of_mins, c))
solve()
算法及复杂度
- 算法:模拟/贪心
- 时间复杂度:我们需要遍历一次所有
种货物,来计算独立采购的总成本。因此,总时间复杂度为
。
- 空间复杂度:我们需要存储两家供应商的价格列表。因此,空间复杂度为
。