2289 马拉松 暴力枚举 曼哈顿距离

解决思路

 
  • 计算总距离:首先计算贝茜不跳过任何检查点的总行进距离。
 
  • 尝试跳过每个检查点:对于每个可以跳过的检查点,计算跳过该检查点后的行进距离,并记录最小的行进距离。
 
  • 输出结果:输出最小的行进距离。
    #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;
    }

     

posted @ 2024-09-30 16:46  CRt0729  阅读(14)  评论(0编辑  收藏  举报