为了更好的阅读体检,可以查看我的算法学习网
题目提交网址P1410
题目描述
小红定义两个数组之间的距离为
∑
i
=
1
n
=
∣
a
i
−
b
i
∣
∑_{i=1}^{n}=|ai−bi|
∑i=1n=∣ai−bi∣ ,即每个位置的差的绝对值之和。
小红现在可以进行任意次操作: 选择任意数组的任意一个元素,使其乘以
−
1
-1
−1。
小红希望最终两个数组的距离尽可能小。你能帮帮她吗?
输入描述
第一行输入一个正整数
n
n
n, 代表两个数组的长度。
第二行输入
n
n
n个整数
a
i
aᵢ
ai,代表第一个数组。
第三行输入
n
n
n个整数
b
i
bᵢ
bi,代表第二个数组。
1 ≤ n ≤ 1 0 5 , − 1 0 9 ≤ a i , b i ≤ 1 0 9 1≤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]即可。
思路:贪心
观察等式,发现其实每一个对位 a i , b i a_i,b_i ai,bi 是各自对应的。所以考虑对每一个位置:
不进行操作: ∣ a i − b i ∣ |a_i-b_i| ∣ai−bi∣
进行操作: ∣ a i + b i ∣ |a_i + b_i| ∣ai+bi∣
注意,不管是对 a i a_i ai 还是 b i b_i bi操作,都是这样
然后答案就是:
∑
i
=
1
n
m
i
n
(
∣
a
i
−
b
i
∣
,
∣
a
i
+
b
i
∣
)
\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;
}