解法一:排序+优先队列
先全部转化为秒来表示,用一个优先队列维护最先可以服务的窗口。
import java.io.*;import java.util.*;public class Main {private static final int ON = 8 * 3600;private static final int OFF = 17 * 3600;public static void main(String[] args) throws IOException {StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));final int N, K;in.nextToken();N = (int) in.nval;in.nextToken();K = (int) in.nval;ArrayList<Customer> customers = new ArrayList<>(N);for (int i = 0, tmp, time; i < N; ++i) {in.nextToken();tmp = (int) in.nval;time = tmp * 3600;in.nextToken();in.nextToken();tmp = (int) in.nval;time += tmp * 60;in.nextToken();in.nextToken();tmp = (int) in.nval;time += tmp;in.nextToken();tmp = (int) in.nval;if (time <= OFF) {customers.add(new Customer(time, tmp * 60));}}Comparator<Customer> customerComparator = new Comparator<Customer>() {@Overridepublic int compare(Customer o1, Customer o2) {return o1.arrive - o2.arrive;}};customers.sort(customerComparator);PriorityQueue<Integer> queue = new PriorityQueue<>();for (int i = 0; i < K; ++i) {queue.offer(ON);}float wait = 0.0f;for (Customer i : customers) {int cur = queue.poll();if (i.arrive < cur) {wait += cur - i.arrive;cur += i.process;} else {cur = i.arrive + i.process;}queue.offer(cur);}out.printf("%.1f", wait / customers.size() / 60);out.flush();}}class Customer {int arrive;int process;public Customer(int arrive, int process) {this.arrive = arrive;this.process = process;}@Overridepublic String toString() {return "Customer{" +"arrive=" + arrive +", process=" + process +'}';}}
