解法一:排序+优先队列

先全部转化为秒来表示,用一个优先队列维护最先可以服务的窗口。

  1. import java.io.*;
  2. import java.util.*;
  3. public class Main {
  4. private static final int ON = 8 * 3600;
  5. private static final int OFF = 17 * 3600;
  6. public static void main(String[] args) throws IOException {
  7. StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
  8. PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
  9. final int N, K;
  10. in.nextToken();
  11. N = (int) in.nval;
  12. in.nextToken();
  13. K = (int) in.nval;
  14. ArrayList<Customer> customers = new ArrayList<>(N);
  15. for (int i = 0, tmp, time; i < N; ++i) {
  16. in.nextToken();
  17. tmp = (int) in.nval;
  18. time = tmp * 3600;
  19. in.nextToken();
  20. in.nextToken();
  21. tmp = (int) in.nval;
  22. time += tmp * 60;
  23. in.nextToken();
  24. in.nextToken();
  25. tmp = (int) in.nval;
  26. time += tmp;
  27. in.nextToken();
  28. tmp = (int) in.nval;
  29. if (time <= OFF) {
  30. customers.add(new Customer(time, tmp * 60));
  31. }
  32. }
  33. Comparator<Customer> customerComparator = new Comparator<Customer>() {
  34. @Override
  35. public int compare(Customer o1, Customer o2) {
  36. return o1.arrive - o2.arrive;
  37. }
  38. };
  39. customers.sort(customerComparator);
  40. PriorityQueue<Integer> queue = new PriorityQueue<>();
  41. for (int i = 0; i < K; ++i) {
  42. queue.offer(ON);
  43. }
  44. float wait = 0.0f;
  45. for (Customer i : customers) {
  46. int cur = queue.poll();
  47. if (i.arrive < cur) {
  48. wait += cur - i.arrive;
  49. cur += i.process;
  50. } else {
  51. cur = i.arrive + i.process;
  52. }
  53. queue.offer(cur);
  54. }
  55. out.printf("%.1f", wait / customers.size() / 60);
  56. out.flush();
  57. }
  58. }
  59. class Customer {
  60. int arrive;
  61. int process;
  62. public Customer(int arrive, int process) {
  63. this.arrive = arrive;
  64. this.process = process;
  65. }
  66. @Override
  67. public String toString() {
  68. return "Customer{" +
  69. "arrive=" + arrive +
  70. ", process=" + process +
  71. '}';
  72. }
  73. }