Submission #912596

#TimeUsernameProblemLanguageResultExecution timeMemory
912596randomlurkerJob Scheduling (CEOI12_jobs)C++17
45 / 100
1080 ms65536 KiB
#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; } /* 8 2 12 1 2 4 2 1 3 5 6 2 3 6 4 */
#Verdict Execution timeMemoryGrader output
Fetching results...