#P11049. [IOI2024] 尼罗河船运
[IOI2024] 尼罗河船运
题目背景
这是一道交互题,你只需要实现代码中要求的函数。
你的代码不需要引用任何额外的头文件,也不需要实现 main
函数。
本题仅支持 C++ 语言提交。但请勿使用 C++14 (GCC 9)
题目描述
你想通过尼罗河来运输 件手工艺品。这些手工艺品从 到 编号。第 ()件手工艺品的重量是 。
为了运输这些手工艺品,你使用了特制的船。每艘船最多可以运两件手工艺品。
- 如果你决定将单件手工艺品放在一艘船上,那么这件手工艺品的重量可以是任意的。
- 如果你想把两件手工艺品一起放在同一艘船上,你必须保证这艘船的平衡。具体来说,如果手工艺品 和 ()的重量差的绝对值不超过 ,即满足 ,那么你可以将它们一起放在同一艘船上。
你必须付费来运一件手工艺品,其运费取决于同一艘船上所运载的手工艺品数量。手工艺品 ()的运费是:
- ,如果你把手工艺品 单独放在船上,或者
- ,如果你把手工艺品 和另一件手工艺品一起放在船上。
注意在第二种情况中,你要为船上两件手工艺品都支付运费。具体来说,如果你决定用同一艘船运输手工艺品 和 (),你需要支付 。
一件手工艺品单独用一艘船运输的费用,总是比与其他手工艺品合用一艘船时的费用要高,所以对任意满足 的 ,都有 。
麻烦的是,由于尼罗河变化莫测,导致 的值经常改变。你的任务是回答 个问题,从 到 编号。这些问题用一个长度为 的数组 来描述。问题 ()的答案,是在 的值等于 时运输所有 件手工艺品的最小总代价。
输入格式
评测程序按如下顺序读取输入数据:
N
W[0] A[0] B[0]
W[1] A[1] B[1]
...
W[N-1] A[N-1] B[N-1]
Q
E[0]
E[1]
...
E[Q-1]
输出格式
评测程序按如下顺序输出:
R[0]
R[1]
...
R[S-1]
这里, 是 calculate_costs
所返回的数组 的长度。
5
15 5 1
12 4 2
2 5 2
10 6 3
21 3 2
3
5
9
1
16
11
23
提示
实现细节
你需要实现以下函数。
std::vector<long long> calculate_costs(
std::vector<int> W, std::vector<int> A,
std::vector<int> B, std::vector<int> E)
- ,,:长度均为 的整数数组,分别给出手工艺品的重量和运费。
- :长度为 的整数数组,给出每个问题中的 值。
- 该函数应该返回一个包含 个整数的数组 ,给出运输手工艺品的最小总代价,其中 对应 等于 (对每个满足 的 )时的运费。
- 对于每个测试用例,该函数恰好被调用一次。
约束条件
- 。
- 。
- 对每个满足 的 ,都有 。
- 对每个满足 的 ,都有 。
- 对每个满足 的 ,都有 。
子任务
子任务 | 分数 | 额外的约束条件 |
---|---|---|
1 | ;;对每个满足 的 ,都有 | |
2 | ;对每个满足 的 ,都有 | |
3 | ;对每个满足 的 ,都有 且 | |
4 | ; | |
5 | ||
6 | 对每个满足 的 ,都有 且 | |
7 | 没有额外的约束条件。 |
例子
考虑以下调用。
calculate_costs([15, 12, 2, 10, 21],
[5, 4, 5, 6, 3],
[1, 2, 2, 3, 2],
[5, 9, 1])
在该例子中,我们有 件手工艺品和 个问题。
在第一个问题中,。你可以把手工艺品 和手工艺品 放在同一艘船上(因为 ),而其他手工艺品都各自放在不同的船上。这使得运输所有手工艺品的总代价最小,即 。
在第二个问题中,。你可以把手工艺品 和手工艺品 放在同一艘船上(因为 ),而把手工艺品 和手工艺品 放在同一艘船上(因为 )。剩下的手工艺品单独用一艘船运输。这使得运输所有手工艺品的总代价最小,即 。
在最后一个问题中,。你需要把每件手工艺品都单独用一艘船运输。这使得运输所有手工艺品的总代价最小,即 。
因此,该函数应该返回 。