# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
912593 | randomlurker | Job Scheduling (CEOI12_jobs) | C++14 | 0 ms | 0 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
typedef long long ll;
typedef long double ld;
using namespace std;
int n, d, m;
priority_queue<int, vector<int>, greater<>> reqs;
priority_queue<int, vector<int>, greater<>> reqsCopy;
priority_queue<int, vector<int>, greater<>> pq;
map<int, queue<int>> locs;
bool test(int x){
for(int day=reqs.top(); day<n; day++){
if (empty(pq) and empty(reqs)) break;
while (!empty(reqs) and reqs.top() <= day) {
pq.push(reqs.top() + d);
reqs.pop();
}
for(int i=0; i<x; i++){
// Complete the x tasks that are due soonest. If any are overdue, then return false
if (day > pq.top()) return false;
else pq.pop();
if (empty(pq)) break;
}
}
return (empty(pq));
}
int main() {
cin >> n >> d >> m;
int x;
for(int i=1; i<=n; i++){
locs.insert({i, {}});
}
for(int i=0; i<m; i++){
cin >> x;
reqs.push(x);
locs[x].push(i+1);
}
int lo = 1;
int hi = INT_MAX;
int mid;
reqsCopy = priority_queue<int, vector<int>, greater<>> (reqs);
while(lo < hi){
reqs = priority_queue<int, vector<int>, greater<>> (reqsCopy);
pq = {};
mid = lo + (hi-lo)/2;
if (test(mid)){
hi = mid;
}
else lo = mid+1;
}
cout << lo << endl;
// Print out optimal movements
reqs = priority_queue<int, vector<int>, greater<>> (reqsCopy);
pq = {};
string dayOut;
for(int day=1; day<=n; day++){
dayOut = "";
while (!empty(reqs) and reqs.top() <= day) {
pq.push(reqs.top() + d);
reqs.pop();
}
for(int i=0; i<lo; i++){
if (empty(pq)) break;
else{
int goodIdx = locs[pq.top()-d].front();
locs[pq.top()-d].pop();
dayOut += to_string(goodIdx) + " ";
pq.pop();
}
}
dayOut += "0";
cout << dayOut << endl;
}
return 0;
}