解决思路
- 计算总距离:首先计算贝茜不跳过任何检查点的总行进距离。
- 尝试跳过每个检查点:对于每个可以跳过的检查点,计算跳过该检查点后的行进距离,并记录最小的行进距离。
- 输出结果:输出最小的行进距离。
#include <bits/stdc++.h> #define ll long long using namespace std; const int N = 1e5 + 10, inf = 0x3f3f3f3f; int x[N], y[N]; int n; int main() { // 读取检查点的数量 cin >> n; ll sum = 0; // 读取每个检查点的坐标 for (int i = 1; i <= n; i++) { cin >> x[i] >> y[i]; // 计算总行进距离 if (i >= 2) sum += abs(x[i] - x[i - 1]) + abs(y[i] - y[i - 1]); } ll ans = inf; // 尝试跳过每个可以跳过的检查点 for (int i = 2; i <= n - 1; i++) { // 计算跳过第 i 个检查点后的行进距离 ll d1 = abs(x[i] - x[i - 1]) + abs(y[i] - y[i - 1]); ll d2 = abs(x[i + 1] - x[i]) + abs(y[i + 1] - y[i]); ll nd = abs(x[i + 1] - x[i - 1]) + abs(y[i + 1] - y[i - 1]); ans = min(ans, sum - d1 - d2 + nd); } // 输出最短行进距离 cout << ans; return 0; }