P15843 [Bulgarian NOI 2024] 显卡 / GPUs

题目背景

在洛谷上提交此题,请选择 >=C++17 的语言标准,不需要引入 `#include "gpus.h"`,而是将 ```cpp #include #include #include inline std::ostream& operator

题目描述

作为一家现代创业公司的创始人,你们启动了一个生成式 AI 项目。图像、文本等的生成过程被拆分为 $N$ 个任务,每个任务需要恰好一台 GPU(显卡)运行一秒钟。你预先知道每个任务何时可用——任务 $i$ 在第 $T_i$ 秒变为可执行状态。你可以使用一台拥有 $M$ 块 GPU 的外部超级计算机,但每块 GPU 的使用成本不同:第 $j$ 块 GPU 每秒花费 $C_j$。你需要为每个任务 $i$ 分配一块特定的 GPU $j$ 和一个具体的时间点,使得该时间点不早于 $T_i$,且在同一时刻、同一块 GPU 上没有其他任务被调度。换言之,每块 GPU 在任意给定秒内最多只能处理一个任务。 设最终完成时间为 $F$(即所有任务中最晚的调度时间加一),总支付金额为 $S$。若任务 $i$ 被分配给 GPU $G_i$,则 $S = C_{G_1} + C_{G_2} + \dots + C_{G_N}$。你的目标是找到 $F \times S$ 的最小可能值。你需要独立解决 $Q$ 个该问题的实例。 ### 交互说明 本题为交互式题目。你无需从标准输入读取数据或向标准输出写入数据,只需实现一个名为 `solveGpus` 的函数,其定义如下: ```cpp __int128 solveGpus( std::vector& gpuCosts, std::vector& reqTimes ); ``` 该函数接收两个 vector 作为参数,这两个 vector 均按**非递减顺序**排序。你可以修改传入的 vector。函数返回类型为 `__int128`,表示一个 128 位整数——这是必要的,因为答案可能超出 `long long` 的范围。该函数会被多次调用,每次调用对应一道独立的题目实例。 你的代码中不应包含 `main` 函数,但可以包含任意其他辅助函数、类、变量等。你的代码必须包含头文件 `gpus.h`,其中为了方便你使用,已定义了用于输出 `__int128` 类型值的运算符。请通过以下预处理指令包含该头文件: ```cpp #include "gpus.h" ``` 你的代码将与评测器一起编译,评测器负责读取输入并写入输出。在评测系统中,唯一计入时间限制的是你的代码实际执行所花费的时间,即输入/输出操作的时间不计入总耗时。 为便于本地测试,我们提供了本地评测器 `Lgrader.cpp` 以及头文件 `gpus.h` 的副本。你需要将自己的代码与本地评测器一同编译,以便进行测试。你可以将它们放在同一目录下,并使用以下命令: ```bash g++ -O2 -std=c++17 -Wl,--stack,1073741824 -Wall gpus.cpp Lgrader.cpp -o gpus.exe ```

输入格式

本地评测器的输入格式如下: 首先为 $Q$,随后对于每个测试用例:$N, M$,接着是所有 $C_j$ 和所有 $T_i$。

输出格式

说明/提示

### 子任务 | 子任务 | 分数 | $N \le$ | $Q \le$ | |:------:|:----:|:-------:|:-------:| | $1$ | $10$ | $10$ | $1$ | | $2$ | $8$ | $800$ | $2$ | | $3$ | $13$ | $2200$ | $2$ | | $4$ | $14$ | $10^4$ | $2$ | | $5$ | $11$ | $10^5$ | $2$ | | $6$ | $15$ | $10^6$ | $5$ | | $7$ | $29$ | $10^7$ | $5$ | 只有当成功通过某子任务所对应的所有测试点时,才能获得该子任务的分数。 ### 限制条件 - $1 \le N \le 10^7$ - $1 \le M \le N$ - $0 \le T_i \le N$ - $1 \le C_i \le 2N$ - $1 \le Q \le 5$ 翻译由 Qwen3.5-397B-A17B 完成