题目链接:1.大石头的搬运工 - 蓝桥云课 (lanqiao.cn)
package lanqiao;
import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.Scanner;
/**
* 2024/3/11
* 将一堆石头移动在一起,移动所需的费用为重量乘以两石头间的距离差
* 例如把重量为2的石头从位置3移动到位置5,所需费用为2*(5-3)=4
* 计算出将所有石头移动在一起的最小费用
* 输入第一行为石头的个数
* 第二行为石头的重量和初始位置
* 输出所有石头移动在一起花费的费用
*/
public class lanqiao3829_大石头的搬运工 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();//石头的堆数
int[][] a = new int[n][2];
for (int i = 0; i < n; i++) {
a[i][0] = scan.nextInt();//重量
a[i][1] = scan.nextInt();//位置
}
Arrays.sort(a, (o1, o2) -> o1[1] - o2[1]);//对位置从小到大排序
int[] pre = new int[n];//前缀和
int p = 0;//计算前面的石头重量总和
for (int i = 0; i < n - 1; i++) {
p += a[i][0];//求和
pre[i + 1] = pre[i] + p * Math.abs(a[i + 1][1] - a[i][1]);//求前缀和(前一位的费用,加上移到下一位的费用)
}
int[] suf = new int[n];//后缀和
int q = 0;//计算后面石头的重量和
for (int j = n - 1; j > 0; j--) {
q += a[j][0];//求和
suf[j - 1] = suf[j] + q * Math.abs(a[j][1] - a[j - 1][1]);//求后缀和(同上)
}
int ans = Integer.MAX_VALUE;//对结果赋最大值
for (int i = 0; i < n; i++) {
ans = Math.min(ans, pre[i] + suf[i]);//查找把所有石头移动到任意位的费用,得到最小值,即为结果
}
System.out.println("最小费用为:"+ans);
}
}
3
2 3
3 1
1 5
最小费用为:8
进程已结束,退出代码为 0