RT
想法是先求出第一个架子上最多能放的钻石然后求第二个最多的。
#include <bits/stdc++.h>
#define maxn 100010
#define itn int
using namespace std;
int a[maxn];
bool book[maxn] = {false};
int l, r;
int ans1;
int ans2;
int ma_ans1;
int ma_ans2;
int n, k;
int max_c;
int main() {
memset(book,false,sizeof(book));
cin >> n >> k;
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
sort(a + 1, a + 1 + n);
l = 1;
r = 2;
book[1] = true;
book[2] = true;
max_c = a[r] - a[l];
while (l <= r && r <= n) {
if (max_c <= k) {
r++;
book[r] = true;
max_c = a[r] - a[l];
ans1++;
ma_ans1 = max(ma_ans1, ans1);
} else {
l++;
book[l - 1] = false;
book[l] = true;
max_c = a[r] - a[l];
ans1--;
}
}
int b[n - ans1 + 1];
for (itn i = 1, j = 1; i <= n; i++) { //重建一个数组(不知道数据范围能不能过掉)
if (!book[i]) {
b[j] = a[i];
j++;
}
}
l = 1;
r = 2;
max_c = b[r] - b[l];
while (l <= r && r <= n) {
if (max_c <= k) {
r++;
max_c = b[r] - b[l];
ans2++;
ma_ans2 = max(ma_ans2, ans2);
} else {
l++;
max_c = b[r] - b[l];
ans2--;
}
}
cout << ma_ans1 + ma_ans2;
return 0;
}