Submission #1300827

#TimeUsernameProblemLanguageResultExecution timeMemory
1300827sz_3312Job Scheduling (CEOI12_jobs)C++17
100 / 100
136 ms20152 KiB
#include <bits/stdc++.h>
using namespace std;

struct Job {
    int day, id;
};

int N, D, M;
vector<Job> jobs;

// Check feasibility using K machines (does NOT build schedule)
bool canFinish(int K) {
    int ptr = 0;

    for (int day = 1; day <= N; day++) {
        for (int used = 0; used < K; used++) {

            if (ptr == M) return true;

            if (jobs[ptr].day > day)
                break;

            if (jobs[ptr].day + D < day)
                return false;

            ptr++;
        }
    }

    return ptr == M;
}

// Build schedule once K is minimal
vector<vector<int>> buildSchedule(int K) {
    vector<vector<int>> sched(N);

    int ptr = 0;

    for (int day = 1; day <= N; day++) {
        for (int used = 0; used < K; used++) {
            if (ptr == M) return sched;
            if (jobs[ptr].day > day) break;
            sched[day - 1].push_back(jobs[ptr].id);
            ptr++;
        }
    }
    return sched;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    cin >> N >> D >> M;

    jobs.resize(M);
    for (int i = 0; i < M; i++) {
        cin >> jobs[i].day;
        jobs[i].id = i + 1;
    }

    sort(jobs.begin(), jobs.end(),
        [](const Job &a, const Job &b) {
            return a.day < b.day;
        });

    int lo = 1, hi = M;
    while (lo < hi) {
        int mid = (lo + hi) / 2;
        if (canFinish(mid)) hi = mid;
        else lo = mid + 1;
    }

    int K = lo;
    auto schedule = buildSchedule(K);

    cout << K << "\n";
    for (int day = 0; day < N; day++) {
        for (int id : schedule[day])
            cout << id << " ";
        cout << 0 << "\n";
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...