【备战秋招】每日一题:2023.07.29-科大讯飞-开发岗-第二题-最小距离

为了更好的阅读体检,可以查看我的算法学习网
题目提交网址P1410

题目描述

小红定义两个数组之间的距离为 ∑ i = 1 n = ∣ a i − b i ∣ ∑_{i=1}^{n}=|ai−bi| i=1n=aibi ,即每个位置的差的绝对值之和。
小红现在可以进行任意次操作: 选择任意数组的任意一个元素,使其乘以 − 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⁹ 1n105,109ai,bi109

输出描述

一个整数,代表两个数组的最小距离。

样例

样例输入

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| aibi

进行操作: ∣ 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=1nmin(aibi,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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

塔子哥学算法

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值