Submission #574545

#TimeUsernameProblemLanguageResultExecution timeMemory
574545havingfun854Job Scheduling (CEOI12_jobs)C++11
100 / 100
277 ms13940 KiB
// https://oj.uz/problem/view/CEOI12_jobs
#include <bits/stdc++.h>
using namespace std;

#define all(x) x.begin(), x.end()
#define forint(i, from, toinc) for (int i = from; i <= toinc; ++i)

void fio()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
#ifdef USEFILE
    freopen("jobs.in", "r", stdin);
    freopen("jobs.out", "w", stdout);
#endif
}

struct Job {
    int id;         // 1e6
    int submitted;  // 1e5
};
int dcnt, delay_limit, jcnt; // day count, .., jobs count
vector<Job> jobs;

void debug()
{
    cerr << "jobs:";
    for (auto &j : jobs) { cerr << " " << j.id << "s" << j.submitted; }
    cerr << endl;
}
void read_data()
{
    cin >> dcnt >> delay_limit >> jcnt;
    forint(i, 1, jcnt) {
        int submitted;
        cin >> submitted;
        jobs.push_back({i, submitted});
    }
    sort(all(jobs), [](const Job &j1, const Job &j2){
        if (j1.submitted == j2.submitted) {
            return j1.id > j2.id;
        } else {
            return j1.submitted < j2.submitted;
        }
    });
    // debug();
}

bool can(int mm, bool print_schedule=false)  // can process using mm machines within delay_limit
{
    int amcnt = mm; // available machine count
    queue<Job> jq;
    int today = 1;
    int nextji = 0;
    while (today <= dcnt) {
        while (amcnt > 0 && !jq.empty()) {
            if (today - jq.front().submitted > delay_limit)
                return false;
            if (print_schedule) { cout << jq.front().id << ' '; }
            jq.pop();
            amcnt--;
        }
        while (jobs[nextji].submitted == today) {
            if (amcnt > 0) {
                amcnt--;
                if (print_schedule) { cout << jobs[nextji].id << ' '; }
            } else {
                jq.push(jobs[nextji]);
            }
            nextji++;
        }
        if (print_schedule) { cout << "0\n"; }
        today++;
        amcnt = mm;
    }

    return true;
}

int main()
{
    fio();
    read_data();

    int l = 0;      // ! can
    int r = jcnt;   // can, no delay
    while (l+1 < r) {
        int m = l + (r-l)/2;
        if (can(m)) {
            r = m;
        } else {
            l = m;
        }
    }
    cout << r << '\n';
    can(r, true);

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...