제출 #670339

#제출 시각아이디문제언어결과실행 시간메모리
670339Charizard2021Job Scheduling (CEOI12_jobs)C++17
100 / 100
510 ms29848 KiB
#include<bits/stdc++.h>
using namespace std;
int n, d, m;
pair<bool, vector<vector<int> > > works(const vector<pair<int, int> > &jobs, int machineCount){
	vector<vector<int> > schedule(n);
	int reqNum = 0;
	for (int day = 1; day <= n; day++){
		for (int j = 0; j < machineCount; j++){
			if (jobs[reqNum].first > day){
				break;
			}
			if (jobs[reqNum].first + d >= day){
				schedule[day - 1].push_back(jobs[reqNum++].second);
			}
			else{
				return make_pair(false, schedule);
			}
			if (reqNum == m){
				return make_pair(true, schedule);
			}
		}
	}
	return make_pair(false, schedule);
}
int main(){
    cin >> n >> d >> m;
	vector<pair<int, int> > jobs(m);
	for (int i = 0; i < m; i++){
		int day;
		cin >> day;
		jobs[i] = make_pair(day, i + 1);
	}
	sort(jobs.begin(), jobs.end());
	vector<vector<int> > result;
	int l = 1, r = m;
	while (l < r){
		int machineNum = (l + r) / 2;
		pair<bool, vector<vector<int> > > curResult = works(jobs, machineNum);
		if (curResult.first){
			r = machineNum;
			result = curResult.second;
		}
		else{
			l = machineNum + 1;
		}
	}
	cout << l << "\n";
	for(int i = 0; i < n; i++){
	    for(int &idx : result[i]){
	        cout << idx << " ";
	    }
	    cout << 0 << "\n";
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...