原题链接:关路灯
import java.util.*;
public class Main {
static class meiz {
int w, v;
}
static int n, s, sloc, st; // 定义静态变量n, s, sloc, st
static meiz[] a = new meiz[1002]; // 定义meiz类型的数组a
static long[][][] f = new long[1002][1002][2]; // 定义三维数组f
static int[] sum = new int[1002]; // 定义数组sum
public static void main(String[] args) {
init(); // 调用初始化方法
dp(); // 调用动态规划方法
}
// 初始化方法
static void init() {
Scanner scanner = new Scanner(System.in);
n = scanner.nextInt(); // 读取整数n
s = scanner.nextInt(); // 读取整数s
for (int i = 1; i <= n; i++) { // 循环读取n个meiz的属性
a[i] = new meiz();
a[i].w = scanner.nextInt(); // 读取位置信息
a[i].v = scanner.nextInt(); // 读取rp损失信息
if (i == s) sloc = a[i].w; // 如果i等于s,则记录当前位置
}
Arrays.sort(a, 1, n + 1, (i, j) -> Integer.compare(i.w, j.w)); // 对a数组按位置信息进行排序
for (int i = 1; i <= n; i++) { // 计算每个位置前的rp损失总和
sum[i] = sum[i - 1] + a[i].v;
if (a[i].w == sloc) st = i; // 如果位置等于当前位置,则记录索引
}
}
// 动态规划方法
static void dp() {
// 初始化数组f的值
for (int i = 1; i <= n; i++) {
for (int j = i; j <= n; j++) {
f[i][j][0] = f[i][j][1] = (long) 1e15;
}
}
f[st][st][0] = f[st][st][1] = 0; // 初始化当前位置的rp损失为0
for (int j = 1; j < n; j++) {
for (int i = 1; i + j <= n; i++) {
int l = i, r = i + j;
// 根据位置计算损失的最小值
f[l][r][0] = Math.min(f[l][r][0], f[l + 1][r][0] + (long) (a[l + 1].w - a[l].w) * (sum[l] + sum[n] - sum[r]));
f[l][r][0] = Math.min(f[l][r][0], f[l + 1][r][1] + (long) (a[r].w - a[l].w) * (sum[l] + sum[n] - sum[r]));
f[l][r][1] = Math.min(f[l][r][1], f[l][r - 1][1] + (long) (a[r].w - a[r - 1].w) * (sum[l - 1] + sum[n] - sum[r - 1]));
f[l][r][1] = Math.min(f[l][r][1], f[l][r - 1][0] + (long) (a[r].w - a[l].w) * (sum[l - 1] + sum[n] - sum[r - 1]));
}
}
long ans = Math.min(f[1][n][0], f[1][n][1]); // 取损失的最小值
System.out.println(ans); // 输出结果
}
}0.0分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复