求助,本地能够过样例在线IDE过不去。。
查看原帖
求助,本地能够过样例在线IDE过不去。。
759274
Stevehim楼主2023/1/7 18:20

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

2023/1/7 18:20
加载中...