思路

  1. 暴力枚举
  2. 排序 + 二分
  3. 排序 + 滑动窗口

过程

alt 时间复杂度:

alt 时间复杂度:

alt 时间复杂度

代码

排序 + 二分

#include <iostream>
#include <climits>
#include <algorithm>

using namespace std;

const int N = 1e6 + 10;
int n, p, a[N];

int main()
{
    cin >> n >> p;
    int minVal = INT_MAX, maxVal = INT_MIN;
    for(int i = 0;i < n;i ++)
    {
        cin >> a[i];
        if(a[i] < minVal) minVal = a[i];
        if(a[i] > maxVal) maxVal = a[i];
    }
    sort(a, a + n);
    int ans = 0;
    for(int i = minVal;i <= maxVal;i ++)
    {
        int x = i - p, y = i + p;
        int l = 0, r = n - 1;
        while(l < r)
        {
            int mid = l + r >> 1;
            if(a[mid] >= x) r = mid;
            else l = mid + 1;
        }
        int begin = l;
        l = 0, r = n - 1;
        while(l < r)
        {
            int mid = l + r + 1 >> 1;
            if(a[mid] > y) r = mid - 1;
            else l = mid;
        }
        int end = l;
        ans = max(ans, end - begin + 1);
    }   
    cout << ans << endl;
    return 0;
}

排序 + 滑动窗口

#include <iostream>
#include <climits>
#include <algorithm>

using namespace std;

const int N = 1e6 + 10;
int n, p, a[N];

int main()
{
    cin >> n >> p;
    for(int i = 0;i < n;i ++) cin >> a[i];
    sort(a, a + n);
    int l = 0, r = 0, ans = 0;
    while(r < n)
    {
        while(a[r] - a[l] > 2 * p) l ++;
        ans = max(ans, r - l + 1);
        r ++;
    }
    cout << ans << endl;
    return 0;
}