public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt(); // 银行的数量
int d = sc.nextInt(); // 约定的距离
int[] num = new int[100000000];
int minA = Integer.MAX_VALUE; // 坐标最小值
int maxA = 0; // 坐标最大值
for (int i = 0; i < n; i++) {
int a = sc.nextInt();
int b = sc.nextInt();
num[a] = b; // 在a位置有b金额
maxA = Math.max(a, maxA);
minA = Math.min(a, minA);
}
// 算法主题部分
int postMax = 0;
int globalMax = 0;
for (int i = minA; i < maxA - d + 1; i++) {
if (num[i] > postMax) {
postMax = num[i];
}
if (num[i+d] != 0) {
int tempMax = postMax + num[i + d];
if (tempMax > globalMax) {
globalMax = tempMax;
}
}
}
System.out.println(globalMax);
}大致思想就是滑动窗口,边界等细节方面可能需要微调。
为了方便数组开这么大,没在牛客打过题,不知道数组开这么大会不会爆掉。