C++ 代码转换为 Java 代码:用 Java 解决区间覆盖问题
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;
}
}
原文地址: https://www.cveoy.top/t/topic/qmEt 著作权归作者所有。请勿转载和采集!