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);
    }

大致思想就是滑动窗口,边界等细节方面可能需要微调。
为了方便数组开这么大,没在牛客打过题,不知道数组开这么大会不会爆掉。