Submission #401938

#TimeUsernameProblemLanguageResultExecution timeMemory
401938rainliofficialJob Scheduling (CEOI12_jobs)C++11
100 / 100
322 ms23504 KiB
#include <bits/stdc++.h>
using namespace std;

int n, d, m;

bool check(int mid, pair<int, int> arr[]){
        int end[mid]; // Tracks when a machine ends its job
        for (int i=0; i<mid; i++){
            end[i] = 0;
        }
        int index = 0;
        int maxD = 0;
        for (int i=0; i<m; i++){
            if (index == mid){
                index = 0;
            }
            if (end[index]+1 > arr[i].first){
                maxD = max(maxD, end[index]+1-arr[i].first);
                end[index]++;
            }else{
                end[index] = arr[i].first; // No delay
            }
            index++;
        }
        return maxD <= d;
}

int main(){
    cin.tie(0);ios_base::sync_with_stdio(0);
    cin >> n >> d >> m;
    pair<int, int> arr[m];
    for (int i=0; i<m; i++){
        int curr; cin >> curr;
        arr[i] = make_pair(curr, i+1);
    }
    sort(arr, arr+m);
    int low = 0;
    int high = m;
    while (low < high){
        int mid = (low + high)/2;
        if (check(mid, arr)){
            high = mid;
        }else{
            low = mid+1;
        }
    }
    vector<int> eachDay[n+1];
    int e[low];
    for (int i=0; i<low; i++){
        e[i] = 0;
    }
    for (int i=0; i<n; i++){
        vector<int> temp;
        eachDay[i] = temp;
    }
    for (int i=0, id = 0; i<m; i++, id++){
        if (id == low){
            id = 0;
        }
        int requestDay = arr[i].first;
        int canDo = e[id]+1;
        e[id] = max(requestDay, canDo); // Only does work when the request comes
        eachDay[e[id]].push_back(arr[i].second);
    }
    cout << low << "\n";
    for (int i=1; i<=n; i++){
        if (eachDay[i].size() != 0){
            for (int j : eachDay[i]){
                cout << j <<  " ";
            }
        }
        cout << 0 << "\n";
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...