https://ac.nowcoder.com/acm/problem/229310
排序 + 二分
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
int n, p;
cin >> n >> p;
vector<int> v(n);
for (int i = 0; i < n; ++i) {
cin >> v[i];
}
sort(v.begin(), v.end());
int min = v[0], max = v[n-1];
int ret = 0;
// i 为枚举温度
for (int i = v[0]; i <= v[n-1]; ++i) {
int begin = 0, end = 0;
int left = 0, right = n-1;
// 查找开始位置
while (left < right) {
int mid = left + (right - left) / 2;
if ( v[mid] - i < -p) {
left = mid + 1;
} else {
right = mid;
}
}
begin = left;
// 查找结束位置
left = begin, right = n-1;
while (left < right) {
int mid = left + (right-left+1) / 2;
if (v[mid] - i <= p) {
left = mid;
} else {
right = mid - 1;
}
}
end = right;
if (end-begin+1 > ret) ret = end-begin+1;
}
cout << ret << endl;
return 0;
}
排序 + 滑动窗口
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
int n, p;
cin >> n >> p;
vector<int> v(n);
for (int i = 0; i < n; ++i) {
cin >> v[i];
}
sort(v.begin(), v.end());
int ret = 0;
// 滑动窗口
int left = 0, right = 0;
while (right < n) {
while(v[right] - v[left] > p*2){
++left;
}
ret = max(ret, right - left + 1);
++right;
}
cout << ret << endl;
return 0;
}