제출 #469469

#제출 시각아이디문제언어결과실행 시간메모리
469469PancakeFactoryJob Scheduling (CEOI12_jobs)C++14
100 / 100
554 ms20236 KiB
#include <bits/stdc++.h>
using namespace std;
/* ################################ */
#define pb push_back
#define FOR(i, a, n) for(int i = (a); i < (n); i++)
#define FORN(i, n) for(int i = 0; i < (n); i++)
#define SZ(x) ((int) (x).size())
#define mp(x,y) make_pair((x), (y))
#define xx first
#define yy second
#define clr clear()
#define MOD 1000000007
typedef long long ll;
/* ################################ */
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wsizeof-array-argument"
template<typename T>void dbg_var(T data){cout<<data<<endl;};
void dbg_vec(const vector<int>& v){FOR(i,0,(int)v.size()){cout<<v[i]<<" ";}cout<<endl;}
void dbg_varlist(const vector<pair<string, int>>& s){FOR(i, 0, (int)s.size()){cout<<s[i].first<<": "<<s[i].second<<" | ";}cout<<endl;}
template <class T, unsigned N> void dbg_arr(T (&arr)[N]){int size = sizeof(arr)/sizeof(arr[0]);FOR(i,0,size){cout<<arr[i]<<" ";}cout<<endl;}
#pragma GCC diagnostic pop
/* ################################ */

pair<int, int> jobs[1000000];
int n, d, m; 

bool possible(int numMachines) {
    vector<int> curWork(numMachines, 0);
    FORN(i, m) {
        int curMachine = i%numMachines;
        curWork[curMachine] = max(curWork[curMachine]+1, jobs[i].first);

        if(curWork[curMachine] - jobs[i].first > d) {
            return false;
        }
    }

    return true;
}

int main() {
    //(void)! freopen("./schedule.in", "r", stdin);
    //(void)! freopen("./schedule.out", "w", stdout);
    ios::sync_with_stdio(0);
    cin.tie(0);

    cin >> n >> d >> m;
    FORN(i, m) {cin >> jobs[i].first; jobs[i].second = i+1;}
    sort(jobs, jobs+m);

    int low = 1;
    int high  = m;

    while(low < high){
        int mid = low + (high - low) / 2;

        if(possible(mid)){
            high = mid;
        }else{
            low = mid + 1;
        }
    }

    cout << low << endl;

    vector<int> curWork(low, 0);
    vector<int> days[n+1];

    FORN(i, m) {
        int curMachine = i%low;
        curWork[curMachine] = max(curWork[curMachine]+1, jobs[i].first);
        days[curWork[curMachine]].push_back(jobs[i].second);

        if(curWork[curMachine] - jobs[i].first > d) {
            return false;
        }
    }

    FOR(i, 1, n+1) {
        for(int x : days[i]) {
            cout << x << " ";
        }
        cout << 0 << endl;
    }

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