C. Liebig's Barrels | Educational Codeforces Round 44

int N, K, L;
cin >> N >> K >> L;
int M = N*K;
vi A(M);
rep(a, M)cin >> A[a];
sort(A.rbegin(), A.rend());
// 必ずできる一番小さい樽の大きさで制限
ll lim = (ll)A.back() + L;
ll re = 0;
// 使ってない板の数、作った樽の数
int cnt = 0, taru = 0;
// 板の長さを降順に見ていく
// 大きい樽を貪欲に作っていく
each(a, A) {
    // 一番小さい樽との大きさの差がL以下
    // かつ板がaも合わせてK個ある
    if (a <= lim && cnt >= K - 1) {
        cnt -= K - 1;
        taru++;
        re += a;
    } else {
        // あとで使う板
        cnt++;
    }
}
if (taru < N)re = 0;
cout << re << endl;