3505. 这也是一道排序题

一、题目

输入

10
7334774857 8461862436 540886577 5245195052 9194400521 5412986878 6694133363 1186771950 1405713915 7115286932 

输出

-29430338967

二、思考

构造差分数组:C[i] = A[i+1] - A[i]

由题目条件可知:当A[i] = A[i+1] + A[i-1] - A[i]时:

C[i](现) = A[i+1] - A[i](现) = A[i] - A[i-1]

C[i-1](现)= A[i](现) - A[i-1] = A[i+1] - A[i]

得出结论:做一次题目中的操作,例如,修改A[i]就会交换差分数组中C[i-1]和C[i]两个的顺序而数组和为A[0]+A[1]+....+A[n-1] = A[0] + (A[0] + C[0](现)) + (A[0] + C[0](现) + C[1](现)).......所以差分数组越前面的项被加的次数越多,要使数组的和最小,差分数组就要按小到大排列

 三、代码

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        long[] a = new long[n];
        for (int i = 0; i < n; i++) {
            a[i] = sc.nextLong();
        }
        long[] c = new long[n - 1];
        for (int i = 0; i < n - 1; i++)
            c[i] = a[i + 1] - a[i];
        Arrays.sort(c);
        long sum = a[0];
        for (int i = 1; i < n; i++) {
            a[i] = a[i - 1] + c[i - 1];
            sum += a[i];
        }
        System.out.println(sum);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

时间邮递员

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

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

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

打赏作者

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

抵扣说明:

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

余额充值