Java教程

P3143 钻石收藏家

本文主要是介绍P3143 钻石收藏家,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

传送门

题目需要求出两段不重合的序列使两段长度和最大。代码关键在于循环变量作为左指针,左右指针之间维护的是第二个序列,而第一个序列在左右指针向前推进的过程中其最大长度被保存下来了。

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

 

这篇关于P3143 钻石收藏家的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!