div3 第二题个人总结

在这道题目中我遇到了几个错误
1.没有考虑首尾边界的条件,所以我给首尾加了特别判定

#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
int a[N];
int main()
{
    int t = 0;
    cin >> t; // 测试组数
    while (t--)
    {
        int n = 0;
        cin >> n;
        for (int i = 1; i <= n; i++)
            cin >> a[i]; // 存入数据,下标从1开始
                         // 进行遍历数组,来寻找哪个适合删除,删除的这个值后,即把a[i]与a[i-1]的距离和a[i]和a[i+1]的距离之和,变成了a[i+1]-a[i-1],那么变化幅度就是这两项的绝对值,其中前两个距离之和一定是大于a[i+1]-a[i-1]的,参考绝对值不等式,但是要考虑首尾的影响
        // 首的情况不妨直接作为起点
        int best = abs(a[2] - a[1]); // 最大节省的时间,为了避免命名冲突,最大值最好用best
        // 开始遍历
        for (int i = 2; i <= n - 1; i++)
        {
            int sum1 = abs(a[i] - a[i - 1]) + abs(a[i] - a[i + 1]);
            int sum2 = abs(a[i + 1] - a[i - 1]);
            if (sum1 - sum2 > best)
                best = sum1 - sum2;
        }
        // 尾的情况考虑
        best = abs(a[n] - a[n - 1]) > best ? abs(a[n] - a[n - 1]) : best;
        // 在这里计算距离之和
        int sum = 0;
        for (int i = 2; i <= n; i++)
        {
            sum += abs(a[i] - a[i - 1]);
        }
        cout << sum - best << endl; // 距离之和减去最大优化
    }

    return 0;
}
全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务