P3143 钻石收藏家
感谢所有AC
思路
题目需要求出两段不重合的序列使两段长度和最大。代码关键在于循环变量作为左指针,左右指针之间维护的是第二个序列,而第一个序列在左右指针向前推进的过程中其最大长度被保存下来了。
代码
#include<iostream>
#include<algorithm>
#define MAXN 50007
using namespace std;
int n, pre, len[MAXN], Dio[MAXN], ans, r = 2, k;
int main(void)
{
cin >> n >> k;
for (int i = 1; i <= n; i++)
cin >> Dio[i];
sort(Dio + 1, Dio + n + 1);
for (int l = 1; l <= n; l++)
{
while (Dio[r] <= Dio[l] + k && r < n + 1) r++;
len[r] = max(r - l, len[r]);
pre = max(pre, len[l]);
ans = max(pre + r - l, ans);
}
cout << ans;
return 0;
}

浙公网安备 33010602011771号