Mỗi cấu trúc giữ một thứ tự
Dữ liệu dưới đây là ví dụ giả định. Mỗi người có mã riêng và đăng kí một trong hai loại suất `ga`, `bo`. Người chọn cùng loại xếp vào cùng hàng theo thứ tự đăng kí. Suất ăn được đặt lên ngăn xếp theo thứ tự chuẩn bị; suất đặt cuối nằm trên cùng và được lấy trước.
Mỗi lượt lấy một suất ở đỉnh. Nếu hàng đăng kí loại đó còn người, phục vụ người đầu hàng ấy. Nếu hàng ấy hết, phục vụ người đầu hàng còn lại và ghi mã người phải đổi loại. Giả định chỉ có hai nhãn ga/bo, tổng số suất bằng tổng số người, mỗi mã xuất hiện một lần.
Dữ liệu và thứ tự phục vụ
|Thứ tự đăng kí|Mã|Loại|
|---|---|---|
|1|01|ga|
|2|02|bo|
|3|03|ga|
|4|04|ga|
|5|05|bo|
|6|06|ga|
Hàng ga là [01,03,04,06], hàng bo là [02,05]. Ngăn xếp suất ăn từ đáy đến đỉnh là `[bo,ga,bo,ga,bo,ga]`.
|Lượt|Suất lấy ở đỉnh|Mã nhận|Đổi loại?|
|---|---|---|---|
|1|ga|01|Không|
|2|bo|02|Không|
|3|ga|03|Không|
|4|bo|05|Không|
|5|ga|04|Không|
|6|bo|06|Có|
Thứ tự phục vụ là 01,02,03,05,04,06; chỉ 06 đổi suất. Hai hàng được giữ FIFO riêng nên không nhất thiết phục vụ theo thứ tự của toàn bộ danh sách đăng kí.
Lấy suất trước, chọn hàng tương ứng
Dùng các hàm ngăn xếp và hàng đợi đã học. Hàm sao chép danh sách suất để không làm mất dữ liệu đầu vào; trả về thứ tự phục vụ và danh sách mã đổi suất.
```python
def serve_two_lines(orders, meals):
ga, bo = Queue(), Queue()
for code, choice in orders:
if choice == 'ga':
enqueue(ga, code)
else:
enqueue(bo, code)
S = meals.copy()
changed, served = [], []
while not isEmptyStack(S):
meal = pop(S)
preferred = ga if meal == 'ga' else bo
other = bo if meal == 'ga' else ga
if not isEmptyQueue(preferred):
code = dequeue(preferred)
else:
code = dequeue(other)
changed.append(code)
served.append(code)
return served, changed
```
Nêu rõ đang tính khoảng thời gian nào
Nếu mọi người bắt đầu chờ ở giây 0, mỗi lượt phục vụ mất đúng một giây và không có khoảng nghỉ, thời điểm hoàn tất sáu lượt là 1,2,3,4,5,6 giây. Trung bình từ lúc bắt đầu chờ đến khi nhận xong là (1+2+3+4+5+6)/6 = **3,5 giây**.
Nếu chỉ tính thời gian chờ trước khi bắt đầu được phục vụ, các giá trị là 0,1,2,3,4,5 giây, trung bình 2,5 giây. Cần xác định cách tính trước khi diễn giải kết quả; hai đại lượng không cùng ý nghĩa.
Bài luyện
Vì sao lượt 4 phục vụ mã 05 trước mã 04?
Không so sánh độ lớn mã.
Hàng ga giữ nguyên FIFO.
Đúng. Chọn hàng theo suất đang lấy.
Trong mỗi hàng vẫn lấy đầu theo FIFO.
Lời giải
Sau ba lượt, 02 đã rời hàng bo nên 05 đứng đầu hàng này. Suất tiếp theo là bo, vì vậy phục vụ 05. Mã 04 tiếp tục chờ trong hàng ga.
Bài luyện
Theo dữ liệu mẫu, mã nào phải nhận khác loại đã đăng kí?
Đúng. Lượt cuối còn suất bo và chỉ còn người chọn ga là 06.
05 nhận bo đúng đăng kí.
04 nhận ga đúng đăng kí.
02 nhận bo đúng đăng kí.
Lời giải
Ba suất ga đã phục vụ 01,03,04. Hai suất bo đầu phục vụ 02,05. Suất cuối là bo nhưng hàng bo đã hết nên chuyển cho 06 của hàng ga; chỉ mã này đổi loại.
Bài luyện
Mọi người chờ từ giây 0; sáu lượt mất một giây mỗi lượt. Trung bình thời gian đến khi nhận xong là bao nhiêu?
2,5 là trung bình trước lúc bắt đầu phục vụ.
Đúng. Trung bình các thời điểm hoàn tất 1 đến 6.
6 chỉ là thời điểm hoàn tất lượt cuối.
1 là thời lượng phục vụ một lượt, chưa tính chờ.
Lời giải
Các thời điểm hoàn tất lần lượt là 1,2,3,4,5,6 giây tính từ lúc cùng bắt đầu chờ. Tổng là 21 giây, chia sáu người được 3,5 giây. Điều kiện cùng chờ từ giây 0 và không nghỉ là cần thiết.
Đang học