FDU 2020 | 3. 打地鼠

1. 题目描述

给定 n 个整数 a 1 , a 2 , . . . , a n a_1, a_2, ..., a_n a1,a2,...,an 和一个 d d d,你需要选出若干整数,使得这些整数从小到大排序后,任意两个相邻的数之差都不小于给定的 d d d ,问最多可选出多少个数。

输入格式

第一行输入两个整数 n , d ( 1 ≤ n ≤ 1 0 5 , 0 ≤ d ≤ 1 0 9 ) n, d (1 \leq n \leq 10^5, 0 \leq d \leq 10^9) n,d(1n105,0d109),分别表示整数个数和相邻整数差的下届。
第二行 n n n 个整数 a 1 , a 2 , . . . , a n ( 1 ≤ a i ≤ 1 0 9 , 1 ≤ i ≤ n a_1, a_2, ..., a_n (1 \leq a_i \leq 10^9, 1 \leq i \leq n a1,a2,...,an(1ai109,1in,表示给定的 n n n 个整数。

输出格式

一个整数,表示答案

样例输入

6 2 
1 4 2 8 5 7

样例输出

3

2. 我的尝试

#include <bits/stdc++.h>

using namespace std;
const int INF = 0x3f3f3f3f;

int main() {
    int n, d;
    int last = -INF;
    int res = 0;
    
    vector<int> nums;
    
    cin >> n >> d;
    
    for (int i = 0; i < n; i++) {
        int x;
        scanf("%d", &x);
        nums.push_back(x);
    }
    
    sort(nums.begin(), nums.end());
    

    for (int i = 0; i < n; i++) {
        if (nums[i] >= last + d) {
            res ++;
            last = nums[i];
        }
    }
    
    cout << res;
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值