-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathprocess_packages.py
65 lines (45 loc) · 1.64 KB
/
process_packages.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# python3
from collections import deque
class Request:
def __init__(self, arrival_time, process_time):
self.arrival_time = arrival_time
self.process_time = process_time
class Response:
def __init__(self, dropped, start_time):
self.dropped = dropped
self.start_time = start_time
class Buffer:
def __init__(self, size):
self.size = size
self.finish_times = deque()
def process(self, request):
while self.finish_times and self.finish_times[0] <= request.arrival_time:
self.finish_times.popleft()
if len(self.finish_times) == self.size:
return Response(True, -1)
else:
start_time = (
self.finish_times[-1] if self.finish_times else request.arrival_time
)
self.finish_times.append(start_time + request.process_time)
return Response(False, start_time)
def read_requests(count):
requests = []
for i in range(count):
arrival_time, process_time = map(int, input().strip().split())
requests.append(Request(arrival_time, process_time))
return requests
def process_requests(requests, buffer):
responses = []
for request in requests:
responses.append(buffer.process(request))
return responses
def print_responses(responses):
for response in responses:
print(response.start_time if not response.dropped else -1)
if __name__ == "__main__":
size, count = map(int, input().strip().split())
requests = read_requests(count)
buffer = Buffer(size)
responses = process_requests(requests, buffer)
print_responses(responses)