btvn.vn
Tìm kiếm Đăng nhập

Biến thể một hàng đợi và điều kiện dừng

Lưu trên thiết bị này
Chuyên đề lựa chọn CS: Ngăn xếp và hàng đợi · Chọn bài khác

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?
Chọn một đáp án

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?
Chọn một đáp án

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?
Chọn một đáp án

Đang học