제출 #565520

#제출 시각아이디문제언어결과실행 시간메모리
565520scc_cJob Scheduling (CEOI12_jobs)C++14
15 / 100
387 ms65536 KiB
#include <iostream>
#include <fstream>
#include <string>
#include <cmath>
#include <sstream>
#include <vector>
#include <algorithm>
#include <map>
#include <set>
#include <iterator>
#include <utility>
#include <unordered_set>
#include <unordered_map>
#include <functional>
#include <queue>
#include <numeric>
#include <deque>

#define lli long long int 

using namespace std;

/*
8 2 12
1 2 4 2 1 3 5 6 2 3 6 4
*/

int works(vector<pair<int, int> > a, int mach, int n, int m, int d){ //k groups, mid is the sum
    int curday = 1, processing = 0;
    for(int i = 0; i < m; i++){
        if(a[i].first < curday-d) return 0;
        if(a[i].first == curday-d) processing++; //if the deadline is almost up then put them as priority on the list
        else if(a[i].first <= curday && processing < mach) processing++;
        if(processing == mach || i == m-1 || a[i+1].first > curday){
            curday++;
            processing = 0;
        }
    }
    if(processing > mach) return 0;
    if(curday > n) return 0;
    return 1;
}

void printworks(vector<pair<int, int> > a, int mach, int n, int m, int d){ //k groups, mid is the sum
    int curday = 1, processing = 0;
    for(int i = 0; i < m; i++){
        if(a[i].first == curday-d){
            cout << a[i].second << " ";
            processing++;
        }
        else if(a[i].first <= curday && processing < mach){
            cout << a[i].second << " ";
            processing++;
        }
        if(processing == mach || i == m || a[i+1].first > curday){
            curday++;
            processing = 0;
            cout << 0 << endl;
        }
    }
    for(int i = curday; i < n+1; i++) cout << 0 << endl;
}

int binsearch(vector<pair<int, int> > a, int l, int r, int n, int m, int d){ //l and r are values of r
    if(l == r) return l;
    if(r == l+1){
        if(works(a, l, n, m, d)) return l;
        return r;
    }
    int mid = (r+l)/2;
    if(works(a, mid, n, m, d)) return binsearch(a, l, mid, n, m, d);
    else return binsearch(a, mid+1, r, n, m, d);
}

int main(){

    int n, d, m;
    cin >> n >> d >> m;

    vector<pair<int, int> > amap;

    for(int i = 0; i < m; i++){
        int x;
        cin >> x;
        amap.push_back(make_pair(x, i+1));
    }
    sort(amap.begin(), amap.end());
    
    int ans = binsearch(amap, 0, 1000001, n, m, d);
    cout << ans << endl;
    printworks(amap, ans, n, m, d);
    
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...