uvalive3610

题目大意:
给出n个块,每个长度为k,给出n个左起点,只要有重叠部分就可以相互跨越,问点数最多的环,并输出点数

思路:
首先将左起点排序,往后面找,判断第i + 1个可不可以加进去前面的阵营
可以形成环的条件:x[i + 1] - x[i - 1] <= k && x[i + 1] - x[i] <= k
代码:

#include <iostream>
using namespace std;
#include <cstring>
#include <stdio.h>
#include <algorithm>

const int maxn = 5555;

int x[maxn];

int main() {

    int T;
    scanf("%d",&T);
    while(T--) {
        int n,k;
        scanf("%d%d",&n,&k);
        for(int i = 1; i <= n; i++)
            scanf("%d",&x[i]);
        sort(x + 1,x + 1 + n);
        int i = 1;
        int ans = 0;
        while(i <= n) {
            int pre = i;
            int cnt = 1;
            while(i < n &&(cnt == 1 || x[i + 1] - x[i - 1] <= k) && x[i + 1] - x[i] <= k) {
                i++;
                cnt++;
            }
            if(pre == i)
                 i++;
            ans = max(ans,cnt);

        }
        printf("%d\n",ans);
    }
    return 0;
}

你可能感兴趣的:(uvalive3610)