제출 #1231617

#제출 시각아이디문제언어결과실행 시간메모리
1231617siryellsalotJob Scheduling (CEOI12_jobs)C++17
0 / 100
379 ms20648 KiB
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstdint>
#include <cmath>

using std::vector, std::pair;

bool sort_by_second(const pair<int, int>& first, const pair<int, int>& second) {
    if (first.second == second.second) {
        return first.first < second.first;
    }
    return first.second < second.second;
}

bool simulate(const vector<pair<int,int>>& jobs, int& days, int& max_delay, uint64_t& guess, vector<pair<int,int>>& out) {
    out.clear();
    auto job_index = 0;
    for (auto cur_day = 1; cur_day <= days; cur_day++) {
        for (auto i = 0; i < guess; i++) {
            if (job_index >= jobs.size()) {
                return true;
            }
            const auto& [jobid, day] = jobs[job_index];
            int diff = cur_day - day;
            if (diff < 0) {
                break;
            }
            if (diff > max_delay) {
                return false;
            }
            out.push_back(pair(jobid, cur_day));
            job_index++;
        }
    }
    return false;
}


int main() {
    int days, max_delay, num_jobs;
    std::cin >> days >> max_delay >> num_jobs;
    vector<pair<int, int>> jobs(num_jobs);

    for (auto i = 0; i < num_jobs; i++) {
        jobs[i].first = i;
        std::cin >> jobs[i].second;
    }

    std::sort(jobs.begin(), jobs.end(), sort_by_second);
    uint64_t upper_bound = num_jobs;
    uint64_t lower_bound = 0;
    uint64_t guess = num_jobs/days;
    vector<pair<int,int>> out(num_jobs);
    while (upper_bound != lower_bound) {
        out.clear();
        if (simulate(jobs, days, max_delay, guess, out)) {
            upper_bound = guess;
        } else {
            lower_bound = guess + 1;
        }
        guess = lower_bound + std::floor((upper_bound - lower_bound) / 2.0);
    }

    std::cout << upper_bound << "\n";
    int lastday = 1;
    for (auto job: out) {
        if (job.second != lastday) {
            std::cout << "0\n";
            lastday = job.second;
        }
        std::cout << job.first + 1 << " ";

    }
    std::cout << "0";
}
#Verdict Execution timeMemoryGrader output
Fetching results...