import java.util.Arrays; import java.util.Scanner;

public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); int R = scanner.nextInt(); int G = scanner.nextInt(); int[] a = new int[2001]; int l = 1; int r = 0; int ans = 0; int[][] dp = new int[2001][2001]; int[] P = new int[2001]; int[] Q = new int[2001];

    for (int i = 1; i <= n; i++) {
        a[i] = scanner.nextInt();
    }
    Arrays.sort(a, 1, n + 1);
    a[0] = 0;
    r = a[n] - a[1] + 1;

    if (R + G >= n) {
        System.out.println("1");
        return;
    }

    while (l <= r) {
        int mid = (l + r) / 2;
        if (check(mid, n, a, R, G, dp, P, Q)) {
            ans = mid;
            r = mid - 1;
        } else {
            l = mid + 1;
        }
    }

    System.out.println(ans);
}

public static boolean check(int L, int n, int[] a, int R, int G, int[][] dp, int[] P, int[] Q) {
    for (int i = 1; i <= n; i++) {
        for (int j = i; j <= n; j++) {
            if (a[j] - a[i] + 1 <= L) {
                P[i] = j;
            }
            if (a[j] - a[i] + 1 <= 2 * L) {
                Q[i] = j;
            }
        }
    }
    P[n + 1] = Q[n + 1] = n;

    for (int i = 0; i <= R; i++) {
        for (int j = 0; j <= G; j++) {
            if (i > 0) {
                dp[i][j] = Math.max(dp[i][j], P[dp[i - 1][j] + 1]);
            }
            if (j > 0) {
                dp[i][j] = Math.max(dp[i][j], Q[dp[i][j - 1] + 1]);
            }
        }
    }

    return dp[R][G] == n;
}

}

C++ 代码转换为 Java 代码:用 Java 解决区间覆盖问题

原文地址: https://www.cveoy.top/t/topic/qmEt 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录