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;
}
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;
}
全部评论
相关推荐
点赞 评论 收藏
分享
点赞 评论 收藏
分享
2025-12-07 16:30
大连理工大学 后端工程师 点赞 评论 收藏
分享
点赞 评论 收藏
分享
