题解/算法 {2967. 使数组成为等数数组的最小代价}

题解/算法 {2967. 使数组成为等数数组的最小代价}

@LINK: https://leetcode.cn/problems/minimum-cost-to-make-array-equalindromic/;

最终整个数组所有元素都要变成T, 题目要求T是回文数, 我们这里先放开这个约束, 那么此时 这个问题 是一个算法模板(中位数-将序列所有元素都变成相同的 最小曼哈顿距离), 即T选择中位数时 代价是最小的;

因此 看一个错误做法, 令T是平均数, 然后找<=T, >=T的第一个回文数, 这是错误的!!! 最小曼哈顿距离 一定是选择中位数;

得到T后, 找<=T, >=T的第一个回文数, 此时 你直接暴力一个个找T, T+1, T+2, ...即可, 因为 比如T是a,b,c,d,e,[?, ?, ?, ?] 你让后半段是[d,c,b,a] 她就是回文的, 也就是前半段abcde 是不会动的, 因此 最多遍历1e5次;

sort( A.begin(), A.end());
auto T = A[ A.size() / 2];
int64_t ANS = Object::INT64_0x3F;
for( auto i = T; i <= int(1e9); ++i){
    auto v = Integer::IntegerToVector( i, -1, 10);
    if( ___Is_palindrome( v.data(), v.size())){
        int64_t sum = 0;
        for( auto j : A){ sum += abs( j - i);}
        ANS = min( ANS, sum);
        break;
    }
}
for( auto i = T; ; --i){
    auto v = Integer::IntegerToVector( i, -1, 10);
    if( ___Is_palindrome( v.data(), v.size())){
        int64_t sum = 0;
        for( auto j : A){ sum += abs( j - i);}
        ANS = min( ANS, sum);
        break;
    }
}
return ANS;
  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值