Submission #1350930

#TimeUsernameProblemLanguageResultExecution timeMemory
1350930i_am_unemployedJob Scheduling (CEOI12_jobs)C++20
100 / 100
25 ms1348 KiB
#include <bits/stdc++.h>
using namespace std;
// given an array of job start dates, a delay d, and a machine count k, checks whether all jobs can be completed with at most delay d.
bool check(const vector<long long>& job_starts, long long delay, long long machine_count) {
    long long job_start_idx = 1;
    long long stored_idx = -1, stored_value = 0;
    // the ith working day
    for (int day = 1; day < job_starts.size(); day++) {
        long long available_machines = machine_count, occupied_machines = 0;
        long long earliest_job_worked_on = job_starts.size();
        // occupy all your machines with the earliest jobs
        while (job_start_idx <= day && available_machines > 0) {
            if (job_starts[job_start_idx] > 0) {
                earliest_job_worked_on = min(earliest_job_worked_on, job_start_idx);
            }
            if ((stored_idx == job_start_idx && available_machines >= stored_value) || (stored_idx != job_start_idx && available_machines >= job_starts[job_start_idx])) {
                available_machines -= (stored_idx == job_start_idx) ? stored_value : job_starts[job_start_idx];
                occupied_machines += (stored_idx == job_start_idx) ? stored_value : job_starts[job_start_idx];
                job_start_idx++;
            } else {
                if (stored_idx != job_start_idx) {
                    stored_idx = job_start_idx;
                    stored_value = job_starts[job_start_idx] - available_machines;
                    available_machines = 0;
                } else {
                    stored_value -= available_machines;
                    available_machines = 0;
                }
            }
        }
        if (day - earliest_job_worked_on > delay) {
            return false;
        }
    }
    return true;
}
void solve() {
    long long m, n, d, a;
    cin >> n >> d >> m;
    vector<long long> job_starts(n + 1, 0);
    for (int i = 0; i < m; i++) {
        cin >> a;
        job_starts[a]++;
    }
    long long lo = 1, hi = m;
    while (lo < hi) {
        long long mid = (lo + hi) / 2;
        if (check(job_starts, d, mid)) {
            hi = mid;
        } else {
            lo = mid + 1;
        }
    }
    cout << lo << "\n";
    for (int i = 0; i < n; i++) {
        cout << "0\n";
    }
}
int main() {
    ios_base::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
    solve();
}
#Verdict Execution timeMemoryGrader output
Fetching results...