POJ3069标记点

#include <iostream>
#include <algorithm>
using namespace std;
int N;
int R;
void Solve()
{
/*
    N = 6;
    R = 10;
    int X[6] = {1, 7, 15, 20, 30, 50};
*/
    cin >> N;
    cin >> R;
    int X[N];
    for(int i = 0; i < N; ++i)
    {
        cin >> X[i];
    }
    int i = 0;
    int result = 0;
    sort(X, X + N);
    while(i < N)
    {
        //s是没有在标记点R范围内最左边的点的位置
        int s = X[i++];
        while(i < N && X[i] <= s + R)
        {
            ++i;
        }
        //p是新加上标记的点的位置
         int p = X[i - 1];
        //判断p标记的点的后面是否有需要标记的点,当i < N时,此时i指向第一个不在p的R范围内的点
        //则此时i指向的点为新的起点,不用考虑i前面的点
        while(i < N && X[i] <= p + R)//这个循环判断是必须的,否则会出现冗余判断点不是从p的覆盖范围外的
                                    //第一个点开始继续判断标记
        {
            ++i;
        }
        //此时i指向了p的R范围外的第一个点
        //当i == N或者p右面存在不在p的R范围内的点则可以确定标记*/
        ++result;
    }
    cout << result;
}
int main()
{
    Solve();
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值