Đa luồng
Đề bài
Mô tả
Cho một chương trình đa luồng gồm tiến trình. Tiến trình thứ thực hiện đoạn mã giả sau:
lặp lại n_i lần
y_i := y
y := y_i + 1
kết thúc lặp
Ở đây là biến dùng chung của toàn bộ chương trình, còn là biến cục bộ của riêng tiến trình . Mỗi dòng lệnh là một thao tác nguyên tử: khi một tiến trình bắt đầu thực hiện một dòng thì nó luôn chạy xong dòng đó mà không bị ngắt. Ngoài ràng buộc đó ra, mọi thứ tự đan xen đều có thể xảy ra: tại mỗi bước, bất kỳ tiến trình nào còn lệnh chưa thực hiện đều có thể được chọn để chạy dòng lệnh tiếp theo của nó.
Nói cách khác, tiến trình có đúng dòng lệnh, xen kẽ nhau: lệnh đọc (gán ) rồi lệnh ghi (gán ), lặp lại lần. Vì giá trị đọc được có thể đã cũ khi lệnh ghi xảy ra, giá trị của có thể bị giảm đi.
Ban đầu . Cho số nguyên , hãy xác định xem có thể xảy ra trường hợp sau khi tất cả tiến trình kết thúc thì hay không. Nếu có, hãy đưa ra một lịch chạy bất kỳ dẫn tới kết quả đó.
Dữ liệu vào
- Dòng đầu chứa hai số nguyên và .
- Dòng thứ hai chứa số nguyên .
Dữ liệu ra
- In ra
Yesnếu có thể đạt được , ngược lại in raNo. - Nếu câu trả lời là
Yes, dòng thứ hai in ra một dãy số nguyên mô tả lịch chạy: số thứ cho biết tiến trình nào thực hiện dòng lệnh tiếp theo của nó ở bước thứ . Dãy này phải gồm đúng số, và tiến trình phải xuất hiện đúng lần.
Nếu có nhiều lịch chạy hợp lệ, in ra lịch nào cũng được.
Ràng buộc
Ví dụ
| Input | Output | Giải thích |
|---|---|---|
| 1 10 11 |
No | Chỉ có một tiến trình nên không có sự đan xen nào: luôn kết thúc bằng , không thể bằng . |
| 2 3 4 4 |
Yes 2 2 1 2 2 2 2 1 2 1 1 1 1 1 1 2 |
Tiến trình 2 chạy một vòng (), tiến trình 1 đọc rồi bị "treo". Tiến trình 2 chạy thêm hai vòng (), tiến trình 1 ghi đè bằng giá trị cũ nên . Tiến trình 2 đọc rồi treo, tiến trình 1 chạy nốt ba vòng, cuối cùng tiến trình 2 ghi . |
| 3 6 1 2 3 |
Yes 2 2 2 2 3 3 3 3 3 3 1 1 |
Đây là kết quả lớn nhất có thể (), đạt được khi các tiến trình chạy tuần tự, không có tiến trình nào ghi đè bằng giá trị cũ. |
Bình luận