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.0分

1 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论