제출 #476456

#제출 시각아이디문제언어결과실행 시간메모리
476456qwerty1234Job Scheduling (CEOI12_jobs)C++14
100 / 100
659 ms31708 KiB
#include <bits/stdc++.h>

using namespace std;

int N, D, M;

struct ValidScheduler {
	bool valid;
	vector<vector<int>> scheduler;
};

ValidScheduler check(int mid, vector<vector<int>> &assign) {
	queue<pair<int, int>> delayed;
	vector<vector<int>> schedule(N);
	ValidScheduler ans;
	for (int i = 0; i < N; i++) {
		int numMachines = mid;
		if (!delayed.empty()) {
			int numRemove = min((int)delayed.size(), numMachines);
			for (int j = 0; j < numRemove; j++) {
				pair<int, int> delayedReq = delayed.front();
				if (i - delayedReq.second > D) {
					ans.valid = false;
					return ans;
				}
				schedule[i].push_back(delayedReq.first);
				delayed.pop();
				numMachines--;
			}
		}
		for (int j = 0; j < (int)assign[i].size(); j++) {
			if (j < numMachines) {
				schedule[i].push_back(assign[i][j]);
			}
			else {
				delayed.push({ assign[i][j], i });
			}
		}
	}
	ans.valid = true;
	ans.scheduler = schedule;
	// for (int i = 0; i < N; i++) {
	// 	for (int j = 0; j < (int)schedule[i].size(); j++) {
	// 		cout << schedule[i][j] << ' ';
	// 	}
	// 	cout << 0 << '\n';
	// }
	return ans;
}

int main() {
	cin >> N >> D >> M;
	vector<vector<int>> assign(N);
	for (int i = 0; i < M; i++) {
		int req;
		cin >> req;
		req--;
		assign[req].push_back(i + 1);
	}
	// for (int i = 0; i < N; i++) {
	// 	cout << "Day: " << i << " , ";
	// 	for (int j = 0; j < assign[i].size(); j++) {
	// 		cout << assign[i][j] << ' ';
	// 	}
	// 	cout << '\n';
	// }
	vector<vector<int>> schedule(N);
	int ans = 0;
	int l = 1;
	int r = M;
	while (l <= r) {
		int mid = l + (r - l) / 2;
		// cout << l << ' ' << r << ' ' << mid << '\n';
		if (check(mid, assign).valid) {
			schedule = check(mid, assign).scheduler;
			ans = mid;
			r = mid - 1;
			// cout << "NEXT\n";
		} else {
			l = mid + 1;
		}
	}
	cout << ans << '\n';
	for (int i = 0; i < N; i++) {
		for (int j = 0; j < (int)schedule[i].size(); j++) {
			cout << schedule[i][j] << ' ';
		}
		cout << 0 << '\n';
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...