题目描述
小红定义两个数组之间的距离为 ∑i=1n=∣ai−bi∣∑_{i=1}^{n}=|ai−bi|∑i=1n=∣ai−bi∣ ,即每个位置的差的绝对值之和。
小红现在可以进行任意次操作: 选择任意数组的任意一个元素,使其乘以 −1-1−1。
小红希望最终两个数组的距离尽可能小。你能帮帮她吗?
输入描述
第一行输入一个正整数nnn, 代表两个数组的长度。
第二行输入nnn个整数aiaᵢai,代表第一个数组。
第三行输入nnn个整数bibᵢbi,代表第二个数组。
1≤n≤105,−109≤ai,bi≤1091≤n≤10⁵,−10⁹≤aᵢ,bᵢ≤10⁹1≤n≤105,−109≤ai,bi≤109
输出描述
一个整数,代表两个数组的最小距离。
样例
样例输入
3
1 2 3
-3 2 -1
样例输出
4
说明
第一个数组变成[-1,2,3], 第二个数组变成[-3,2,1]即可。
思路:贪心
观察等式,发现其实每一个对位ai,bia_i,b_iai,bi 是各自对应的。所以考虑对每一个位置:
不进行操作:∣ai−bi∣|a_i-b_i|∣ai−bi∣
进行操作:∣ai+bi∣|a_i + b_i|∣ai+bi∣
注意,不管是对aia_iai 还是bib_ibi操作,都是这样
然后答案就是:
∑i=1nmin(∣ai−bi∣,∣ai+bi∣)
\sum_{i=1}^{n}min(|a_i-b_i|,|a_i + b_i|)
i=1∑nmin(∣ai−bi∣,∣ai+bi∣)
代码
#include<bits/stdc++.h>
using namespace std;
int main (){
int n;
cin >> n;
vector<int> a(n + 1) , b(n + 1);
for (int i = 1 ; i <= n ; i++) cin >> a[i];
for (int i = 1 ; i <= n ; i++) cin >> b[i];
vector<long long> res(n + 1);
for (int i = 1 ; i <= n ; i++){
long long tmp = min(abs(a[i] - b[i]) , abs(a[i] + b[i]));
res[i] = res[i - 1] + tmp;
}
cout << res[n] << endl;
}