Submission #1183008

#TimeUsernameProblemLanguageResultExecution timeMemory
1183008surJob Scheduling (CEOI12_jobs)Java
5 / 100
369 ms131072 KiB
import java.io.*; import java.util.*; public class jobs { // Maximum size for counting job requests per day. private static final int MAX_SIZE = (int) 1e6 + 5; // totalDays: Total number of days available. // totalJobs: Total number of job requests. // deadlineExtension: Extra days allowed after a job's request day. private static int totalDays, totalJobs, deadlineExtension; // requestCountByDay[i] stores the number of jobs that are requested on day i. private static int[] requestCountByDay = new int[MAX_SIZE]; /** * Checks whether the schedule is feasible using a given daily processing capacity. * * A deque is used to store the deadlines (day + deadlineExtension) of the pending jobs. * For every day, jobs requested on that day add their deadline into the deque. * Then, up to 'dailyCapacity' jobs are processed (removed from the deque). * The schedule is feasible if, after processing all days, there are no pending jobs left. * * @param dailyCapacity The number of jobs that can be processed per day. * @return true if all jobs can be processed within their deadlines, false otherwise. */ private static boolean isFeasible(int dailyCapacity) { // Use a deque to track deadlines of pending jobs. Deque<Integer> deadlineQueue = new ArrayDeque<>(); // Process each day from 1 through totalDays. for (int day = 1; day <= totalDays; day++) { // If there is any pending job whose deadline has passed (deadline < current day), // the schedule is not feasible. if (!deadlineQueue.isEmpty() && deadlineQueue.peekFirst() < day) { return false; } // For all jobs requested on the current day, add their deadlines to the queue. // Each job's deadline is its request day plus the deadlineExtension. for (int j = 0; j < requestCountByDay[day]; j++) { deadlineQueue.addLast(day + deadlineExtension); } // Process up to 'dailyCapacity' jobs for the current day. // This simulates each machine (or processing unit) handling one job. for (int j = 0; j < dailyCapacity; j++) { if (deadlineQueue.isEmpty()) { break; } deadlineQueue.pollFirst(); } } // If after all days there are no pending jobs, the schedule is feasible. return deadlineQueue.isEmpty(); } public static void main(String[] args) throws IOException { // Set up input reading. DataInputStream dis = new DataInputStream(System.in); BufferedReader br = new BufferedReader(new InputStreamReader(dis)); // Read the first line of input: totalDays, deadlineExtension, and totalJobs. StringTokenizer st = new StringTokenizer(br.readLine()); totalDays = Integer.parseInt(st.nextToken()); deadlineExtension = Integer.parseInt(st.nextToken()); totalJobs = Integer.parseInt(st.nextToken()); // Read the second line of input: the request day for each job. // Reset job request counts to zero before counting. st = new StringTokenizer(br.readLine()); Arrays.fill(requestCountByDay, 0); for (int i = 0; i < totalJobs; i++) { int requestDay = Integer.parseInt(st.nextToken()); requestCountByDay[requestDay]++; } // Binary search for the minimum daily processing capacity (machines) required. int left = 1, right = totalJobs, optimalCapacity = 0; while (left <= right) { int midCapacity = (left + right) >> 1; if (isFeasible(midCapacity)) { // If scheduling is possible with midCapacity, try for a lower capacity. right = midCapacity - 1; optimalCapacity = midCapacity; } else { // Otherwise, increase the capacity. left = midCapacity + 1; } } // Output the found minimum daily processing capacity. System.out.println(optimalCapacity); // The problem output format requires printing a "0" on a new line for each day. for (int day = 0; day < totalDays; day++) { System.out.println(0); } } }
#Verdict Execution timeMemoryGrader output
Fetching results...