解法一:排序+优先队列
先全部转化为秒来表示,用一个优先队列维护最先可以服务的窗口。
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>() {
@Override
public 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;
}
@Override
public String toString() {
return "Customer{" +
"arrive=" + arrive +
", process=" + process +
'}';
}
}