塔台超频 - 最小超频电压算法详解及代码实现
塔台超频 - 最小超频电压算法详解及代码实现
问题描述
在一条笔直的马路上有 $n$ 个塔台,它们被依次标号为 $1, 2, \cdots, n$,分别处于距离马路起点 $a _ 1, a _ 2, \cdots, a _ n$($a _ 1 < a _ 2 < \cdots < a _ n$)的位置。
每个塔台初始时有一个通讯半径 $b _ 1, b _ 2, \cdots, b _ n$,这代表,对于 $i$ 号塔台,其可以与 $[a _ i - b _ i, a _ i + b _ i]$ 范围内的塔台通讯。
需要特别注意,对于两个塔台 A、B,当且仅当 A 塔台的位置处在 B 塔台的通讯范围内,B 塔台才能向 A 塔台传递信号。请注意这里不是「二者的通讯范围重合,即可通讯」。
现在你可以对这些塔台进行超频。具体的,你可以指定一个电压 $k$,之后所有塔台都会被加上 $k$ 的电压,通讯半径都会增大 $k$。这里的 $k$ 仅可为非负整数。
现在要求你通过超频,使信号可以从 $1$ 号塔台依次通过 $2, 3, \cdots$ 号塔台传输到 $n$ 号塔台,但是由于不合理的超频会较严重地磨损塔台,因此你想要尽可能降低超频的电压。
请你计算出,为了达到以上目的,塔台超频需要的最小电压是多少。
输入格式
输入共 $n + 1$ 行。
第一行为一个整数 $n$,代表塔台的数量。
接下来 $n$ 行,每行两个整数 $a _ i, b _ i$,分别代表各个塔台的位置和初始通讯半径。
输出格式
输出共一行一个整数,代表为了达到目的,塔台超频需要的最小电压。
样例 #1
样例输入 #1
5
0 4
2 2
3 1
12 8
19 2
样例输出 #1
8
提示
数据规模与约定
对于 $100%$ 的数据,保证 $2 \leq n \leq 5 \times 10 ^ 5$,$0 \leq a _ i, b _ i \leq 10 ^ 9$。
| 测试点编号 | 特殊限制 |
| :----------: | :----------: |
| $1 \sim 2$ | $n \leq 10$,$a _ i, b _ i \leq 200$ |
| $3$ | $a _ i = i$ |
| $4 \sim 5$ | $b _ i = 0$ |
| $6$ | 所有 $b _ i$ 相同 |
| $7 \sim 10$ | 无特殊限制 |
cpp code.内容:```cpp
#include
using namespace std;
int main() { int n; cin >> n;
vector<pair<int, int>> towers;
for (int i = 0; i < n; i++) {
int a, b;
cin >> a >> b;
towers.push_back(make_pair(a, b));
}
sort(towers.begin(), towers.end());
int maxVoltage = 0;
int minVoltage = 0;
for (int i = 1; i < n; i++) {
int distance = towers[i].first - towers[i-1].first;
int radius = max(towers[i-1].second, towers[i].second);
int voltage = max(0, distance - radius);
maxVoltage = max(maxVoltage, voltage);
minVoltage = max(minVoltage, voltage);
}
cout << minVoltage << endl;
return 0;
}
原文地址: https://www.cveoy.top/t/topic/pNtI 著作权归作者所有。请勿转载和采集!