思路
- 暴力枚举
- 排序 + 二分
- 排序 + 滑动窗口
过程
时间复杂度:
时间复杂度:
时间复杂度
代码
排序 + 二分
#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;
}