正经题解|最小绝对差值和
2024-05-13 11:48:40
发布于:浙江
75阅读
0回复
0点赞
题意解析
犹豫只能操作一次,所以我们可以枚举被替换的元素 。统计未替换时, 和 的绝对差值和 ,然后记录枚举 的过程中替换后可以减少的差值的最大值 ,最后的答案即为 。
接下来我们考虑如果快速求出对于每个 的 。要想最小化 ,那么我们可以在数组 中找到一个最接近 的数字。
使用二分查找在数组 中,第一个大于 的元素下标 ,那么此时 为最后一个小于等于 的数字。此时与 的差最小的元素,为其中一个,取最小值即可。
AC 代码
#include <bits/stdc++.h>
using namespace std;
using i64 = long long;
int main() {
cin.tie(nullptr)->sync_with_stdio(false);
int _; cin >> _;
while (_--) {
int n; cin >> n;
vector<int> a(n), b(n), c(n);
for (auto &x : a) cin >> x;
for (auto &x : b) cin >> x;
for (auto &x : c) cin >> x;
sort(begin(c), end(c));
i64 res = 0, max_diff = 0;
for (int i = 0; i < n; ++i) {
int real = abs(a[i] - b[i]), changed = real;
int hi = upper_bound(begin(c), end(c), b[i]) - begin(c);
int lo = hi - 1;
if (hi < n)
changed = min(changed, abs(c[hi] - b[i]));
if (lo >= 0)
changed = min(changed, abs(c[lo] - b[i]));
max_diff = max(max_diff, real * 1LL - changed);
res += real;
}
cout << res - max_diff << '\n';
}
return 0;
}
复杂度分析
对于每个 使用二分查找数组 中最接近 的数字,时间复杂度为 ,总的时间复杂度为 。
全部评论 2
long long minDiffSumOp = INT_MAX;
我错哪了????2024-05-15 来自 广东
0INT_MAX 需要头文件 <limits.h>
2024-05-16 来自 浙江
0
为什么我手打二分用时就比老师长
2024-05-13 来自 广东
050ms以内这个时间是有误差的,差了一点点也比较正常
2024-05-16 来自 浙江
0哦,谢谢老师
2024-05-16 来自 广东
0
有帮助,赞一个