塔台超频 - 贪心算法解题思路及代码实现\n\n### 题目描述\n\n在一条笔直的马路上有 $n$ 个塔台,它们被依次标号为 $1, 2, \cdots, n$,分别处于距离马路起点 $a _ 1, a _ 2, \cdots, a _ n$($a _ 1 < a _ 2 < \cdots < a _ n$)的位置。\n\n每个塔台初始时有一个通讯半径 $b _ 1, b _ 2, \cdots, b _ n$,这代表,对于 $i$ 号塔台,其可以与 $[a _ i - b _ i, a _ i + b _ i]$ 范围内的塔台通讯。\n\n需要特别注意,对于两个塔台 A、B,当且仅当 A 塔台的位置处在 B 塔台的通讯范围内,B 塔台才能向 A 塔台传递信号。请注意这里不是「二者的通讯范围重合,即可通讯」。\n\n现在你可以对这些塔台进行超频。具体的,你可以指定一个电压 $k$,之后所有塔台都会被加上 $k$ 的电压,通讯半径都会增大 $k$。这里的 $k$ 仅可为非负整数。\n\n现在要求你通过超频,使信号可以从 $1$ 号塔台依次通过 $2, 3, \cdots$ 号塔台传输到 $n$ 号塔台,但是由于不合理的超频会较严重地磨损塔台,因此你想要尽可能降低超频的电压。\n\n请你计算出,为了达到以上目的,塔台超频需要的最小电压是多少。\n\n### 输入格式\n\n输入共 $n + 1$ 行。\n\n第一行为一个整数 $n$,代表塔台的数量。\n接下来 $n$ 行,每行两个整数 $a _ i, b _ i$,分别代表各个塔台的位置和初始通讯半径。\n\n### 输出格式\n\n输出共一行一个整数,代表为了达到目的,塔台超频需要的最小电压。\n\n### 样例 #1\n\n#### 样例输入 #1\n\n\n5\n0 4\n2 2\n3 1\n12 8\n19 2\n\n\n#### 样例输出 #1\n\n\n8\n\n\n### 提示\n\n#### 数据规模与约定\n\n对于 $100% $ 的数据,保证 $2 \leq n \leq 5 \times 10 ^ 5$,$0 \leq a _ i, b _ i \leq 10 ^ 9$。\n\n| 测试点编号 | 特殊限制 |\n| :----------: | :----------: |\n| $1 \sim 2$ | $n \leq 10$,$a _ i, b _ i \leq 200$ |\n| $3$ | $a _ i = i$ |\n| $4 \sim 5$ | $b _ i = 0$ |\n| $6$ | 所有 $b _ i$ 相同 |\n| $7 \sim 10$ | 无特殊限制 |\n\n### 解题思路\n\n本题是一个贪心算法的题目。我们可以从左到右遍历每个塔台,根据当前塔台的位置和通讯半径,计算出当前塔台需要超频的电压。\n\n具体的,我们可以维护一个变量 max_pos 表示当前能够被传递信号的最远的位置。然后对于每个塔台,如果当前塔台的位置超过了 max_pos,则需要超频的电压为当前塔台的位置减去 max_pos,并将 max_pos 更新为当前塔台的位置加上超频的电压。\n\n最后,将所有塔台需要超频的电压求和即可得到最小电压。\n\n### 复杂度分析\n\n遍历一次塔台,时间复杂度为 $O(n)$。\n\n### 代码实现\n\ncpp\n#include <iostream>\nusing namespace std;\n\nint main() {\n int n;\n cin >> n;\n long long a[n], b[n];\n for (int i = 0; i < n; i++) {\n cin >> a[i] >> b[i];\n }\n long long max_pos = a[0] + b[0];\n long long ans = 0;\n for (int i = 1; i < n; i++) {\n if (a[i] > max_pos) {\n ans += a[i] - max_pos;\n max_pos = a[i] + b[i] + ans;\n }\n }\n cout << ans << endl;\n return 0;\n}\n\n


原文地址: https://www.cveoy.top/t/topic/pNtl 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录