Java
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.*;
public class Main {
static final int OPEN_TIME = 8 * 3600;
static final int CLOSE_TIME = 17 * 3600;
static class Person implements Comparable<Person> {
int arriveTime;
int serviceTime;
Person(int arriveTime, int serviceTime) {
this.arriveTime = arriveTime;
this.serviceTime = serviceTime;
}
@Override
public int compareTo(Person t) {
return Integer.compare(this.arriveTime, t.arriveTime);
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int k = Integer.parseInt(st.nextToken());
PriorityQueue<Integer> windows = new PriorityQueue<>();
for (int i = 0; i < k; ++i) {
windows.add(OPEN_TIME);
}
Person[] persons = new Person[n];
for (int i = 0; i < n; ++i) {
st = new StringTokenizer(br.readLine());
String[] timeParts = st.nextToken().split(":");
int hh = Integer.parseInt(timeParts[0]);
int mm = Integer.parseInt(timeParts[1]);
int ss = Integer.parseInt(timeParts[2]);
int serviceMinute = Integer.parseInt(st.nextToken());
int arriveTime = hh * 3600 + mm * 60 + ss;
int serviceTime = serviceMinute * 60;
persons[i] = new Person(arriveTime, serviceTime);
}
Arrays.sort(persons);
int sum = 0, cnt = 0;
for (int i = 0; i < n; ++i) {
Person person = persons[i];
int window = windows.poll();
if (person.arriveTime > CLOSE_TIME) {
break;
}
int startTime = Math.max(window, person.arriveTime);
sum += startTime - person.arriveTime;
cnt++;
window = startTime + Math.min(person.serviceTime, 3600); // 从开始办理时间开始算
windows.add(window);
}
System.out.printf("%.1f", sum / 60.0 / cnt);
}
}
C++
#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
const int MAXN = 10010, INF = 1e7 + 10;
int n, k;
struct Person {
int arrive_time;
int service_time;
bool operator<(const Person &t) const {
return arrive_time < t.arrive_time;
}
} persons[MAXN];
priority_queue<int, vector<int>, greater<int> > windows;
int main() {
cin >> n >> k;
for (int i = 0; i < k; ++i) windows.push(8 * 3600);
for (int i = 0; i < n; ++i) {
int hh, mm, ss, service_minute;
scanf("%d:%d:%d %d", &hh, &mm, &ss, &service_minute);
persons[i].arrive_time = hh * 3600 + mm * 60 + ss;
persons[i].service_time = service_minute * 60;
}
sort(persons, persons + n);
int sum = 0, cnt = 0;
for (int i = 0; i < n; ++i) {
auto person = persons[i];
auto window = windows.top();
windows.pop();
if (person.arrive_time > 17 * 3600) break;
int start_time = max(window, person.arrive_time);
sum += start_time - person.arrive_time;
cnt++;
window = start_time + min(person.service_time, 1 * 3600); // 从开始办理时间开始算!!!
windows.push(window);
}
printf("%.1lf", sum / 60.0 / cnt);
return 0;
}