#P12504. 「CEOI2025」割草机
「CEOI2025」割草机
注意事项
请在提交源代码前添加 #include "lawn.h"
。
题目描述
在 Poenari 堡垒的冒险之后,Vlad 回到家,作为一个真正的罗马尼亚人,他的第一个想法是他应该喂他的马。马对食物并不挑剔,所以 Vlad 将他的草坪作为马的主要食物来源。
为了完成这项任务,Vlad 有一台容量为 的割草机。他决定将草坪分成 条通道,编号从 到 ,他必须按此顺序割草。每条通道 含有未割草的数量 ,由于一些未知原因,Vlad 推动割草机经过该通道需要 秒。
在经过几条通道后,割草机可能会达到满载状态,此时它会停止割草,留下该通道上的一些草。每当这种情况发生时,需要清空其收集箱,这需要 秒,并且只能在通道末尾进行。如果收集箱在 Vlad 经过通道 时装满,他需要继续推动割草机直到通道末尾,清空收集箱,然后再次经过该通道(或根据需要多次)以割除剩余的草。例如,如果对于通道 我们需要通过 次才能清除所有草,那将花费 秒。在割完整个草坪后,必须清空割草机。
经过大量思考和抱怨完成割草将花费他太多时间后,Vlad 得出结论,有时在收集箱达到满载之前清空它可能更省时,但他不确定可以使用的最佳策略。因此,他请求你的帮助。
给定每条通道上的草量和推动割草机经过每条通道所需的时间,收集箱的容量和清空它所需的时间,找出 Vlad 以最短时间完成割草的最佳方式。
实现细节
你应该实现以下程序:
long long mow(int n, int c, int b, std::vector<int> &a, std::vector<int> &v);
- :草坪的通道数量
- :收集箱的总容量
- :清空收集箱所需的秒数
- :长度为 的向量,描述经过每条通道所需的时间
- :长度为 的向量,给出每条通道上的草量
- 该程序应返回一个整数,表示割草的最短时间。
- 对于每个测试点,该程序只被调用一次。
示例评测程序
示例评测程序读取以下格式的输入:
- 第 行:
- 第 行:
- 第 行:
并输出调用 mow
函数的结果,使用相应的参数。
样例 1
考虑以下调用:
mow(3, 5, 2, {2, 10, 3}, {2, 4, 6})
在这个样例中,有 条通道,收集箱容量为 ,清空它需要 秒。
对于这个样例,Vlad 将在 秒内割第一条通道。割草机中的草量将为 。然后他将在 秒内清空割草机。在第一条通道上,他花费 秒。
接着他将通过第二条通道。他将割 个单位的草。他选择在完成第二条通道后不清空收集箱。在第二条通道上花费的时间是 秒。
对于第三条通道,他开始割草。在割了 个单位的草后,他的割草机装满,因此他必须继续走到通道末尾,清空割草机,然后再次开始割第三条通道。请注意,在整个草坪割完后,割草机必须被清空。在第三条通道上花费的时间是 秒。
总共,他花费 秒。可以证明这是 Vlad 割草的最佳策略。
样例 2
考虑以下调用:
mow(4, 10, 4, {1, 2, 1, 4}, {3, 2, 6, 7})
在这个样例中,有 条通道,收集箱容量为 ,清空它需要 秒。
最佳策略是直接经过前 条通道,之后收集箱将装满,草量向量将为 。之后,应清空收集箱,并割最后 条通道,最后再次清空收集箱。
总秒数将是 。
数据范围与提示
对于所有输入数据,满足:
- 对于每个 ,
- 对于每个 ,
- 保证正确结果不超过
详细子任务附加限制及分值如下表所示。
子任务 | 分值 | 附加限制 |
---|---|---|
所有给定值( 和 )最多为 | ||
且对于所有 , | ||
无附加限制 |