Giữ suất ở đỉnh cho tới khi có người nhận
Biến thể này chỉ có **một hàng chung**, vẫn theo thứ tự đăng kí ban đầu. Xem suất ở đỉnh: nếu người đầu hàng chọn đúng loại thì lấy cả người lẫn suất; nếu không khớp thì chuyển người ấy xuống cuối và giữ suất.
Nếu đã xét đủ số người đang chờ trong một vòng mà không ai chọn loại của suất trên đỉnh, quá trình dừng. Quay vòng thêm sẽ lặp đúng các lựa chọn cũ, không tạo người phù hợp. Đây là quy tắc khác với bài hai hàng: không bắt người đổi loại và không lấy suất phía dưới để bỏ qua suất trên đỉnh.
Giới hạn một vòng bằng số người hiện có
Dùng orders là danh sách các cặp mã–loại và meals viết từ đáy đến đỉnh. Tạo bản sao để giữ đầu vào. `range(len(waiting))` xác định số người cần xét của vòng hiện tại trước khi bắt đầu vòng for.
```python
def remaining_one_line(orders, meals):
waiting = orders.copy()
S = meals.copy()
while waiting and S:
meal = top(S)
served = False
for _ in range(len(waiting)):
person = dequeue(waiting)
if person[1] == meal:
pop(S)
served = True
break
enqueue(waiting, person)
if not served:
break
return len(waiting)
```
Một suất không khớp với ai còn lại
Dùng dữ liệu sáu người của bài trước. Sau khi phục vụ 01,02,03, hàng chung còn 04(ga),05(bo),06(ga); suất tiếp theo là bo. 04 chuyển xuống cuối, 05 nhận suất. Hàng còn 06(ga),04(ga); suất ga tiếp theo do 06 nhận.
Cuối cùng còn 04(ga), nhưng suất trên đỉnh là bo. Xét một vòng vẫn không có ai nhận, nên dừng với **1 người còn chờ**. Cùng đầu vào nhưng quy tắc một hàng cho thứ tự khác hai hàng; cần xác định đúng mô hình trước khi viết mã.
Chạy bộ mẫu trên Python 3
Tải và giải nén toàn bộ ZIP vào một thư mục. Bộ mẫu gồm tuyen_tinh.py, dang_ki.inp, suat_an.inp và HUONG_DAN.txt. Mở tuyen_tinh.py bằng IDLE hoặc trình soạn thảo có Python 3 rồi chạy; hai tệp dữ liệu được đọc từ thư mục chứa mã.
Trong dang_ki.inp, mỗi dòng có mã và nhãn ga/bo. Trong suat_an.inp, các nhãn cách nhau bằng khoảng trắng, viết từ đáy đến đỉnh. Kết quả chính: thứ tự 01,02,03,05,04,06; mã đổi suất 06; biến thể một hàng còn 1 người chờ.
Để thực hành, lưu một bản sao thư mục và thử đổi dữ liệu nhỏ, vẫn giữ đúng các giả định. So thứ tự in ra với bảng truy vết bằng tay. Nếu bị đảo thứ tự suất, kiểm lại quy ước đáy–đỉnh; nếu không đọc được tệp, kiểm đã giải nén đủ và giữ nguyên tên. Các câu luyện kiểm hiểu kết quả; việc chọn đáp án không thay cho chạy mã trên máy.
Bài luyện
Hàng đang có A(ga), B(ga); suất trên đỉnh là bo. Theo biến thể một hàng, phải làm gì sau khi xét cả hai người?
Đúng. Thêm vòng không làm thay đổi các lựa chọn.
Không có quy tắc đổi ý nên có thể lặp vô hạn.
Không được bỏ qua đỉnh ngăn xếp.
Biến thể này không bắt đổi suất.
Lời giải
Sau khi xét A và B, cả hai đều chọn ga. Chuyển xuống cuối chỉ đổi vị trí chứ không đổi lựa chọn. Vì không ai nhận bo trên đỉnh, cần dừng; còn hai người chờ.
Bài luyện
Trong dữ liệu sáu người, khi chỉ còn 06(ga),04(ga) và suất trên đỉnh là ga, ai nhận trước ở biến thể một hàng?
Không sắp xếp theo mã.
Mỗi lượt chỉ một người nhận một suất.
Đúng. Quy tắc xét đầu hàng, không xét mã.
05 đã được phục vụ ở lượt trước.
Lời giải
Sau khi 04 chuyển cuối để 05 nhận bo, hàng còn [06,04]. Suất kế tiếp là ga nên người đầu hàng 06 nhận. Điều này giải thích vì sao cuối cùng 04 còn chờ.
Bài luyện
Nếu đã thử một vòng mà không ai khớp, vì sao vòng while phải dừng?
Người không khớp được thêm lại, nên hàng chưa rỗng.
enqueue chỉ chuyển vị trí.
Không cần giả định loại các suất phía dưới.
Đúng. Không có bước nào tạo thêm khả năng phục vụ.
Lời giải
Trong cả vòng, không suất nào được lấy và mọi người chỉ chuyển vị trí. Sau khi đủ một vòng, thứ tự ban đầu trở lại, suất đỉnh không đổi, lựa chọn không đổi. Lặp tiếp sẽ không tiến triển nên phải thoát.
Đang học