solution

sortして貪欲。$O(N)$。

まだ乗るバスが決まってない人の中で到着時刻が最小の人を人$l$とする。 この人の乗れるバスがあるなら乗り、そうでないなら時刻$T_i + K$に出発するバスを作るのが妥当である。 $T$をsortしておけば、これは配列を一度なめるだけで実行できる。

implementation

#include <iostream>
#include <vector>
#include <algorithm>
#define repeat(i,n) for (int i = 0; (i) < int(n); ++(i))
#define whole(f,x,...) ([&](decltype((x)) whole) { return (f)(begin(whole), end(whole), ## __VA_ARGS__); })(x)
using namespace std;
int main() {
    int n, c, k; cin >> n >> c >> k;
    vector<int> t(n); repeat (i,n) cin >> t[i];
    whole(sort, t);
    int cnt = 0;
    int l = 0;
    while (l < n) {
        int r = l;
        while (r < n and r - l < c and t[r] <= t[l] + k) ++ r;
        ++ cnt;
        l = r;
    }
    cout << cnt << endl;
    return 0;
}