Các lượt nộp
    Danh sách bài
    Trang chủ
    Báo lỗi
    solution

    Đề bài: [Go] Select + cancel: dừng sớm tất cả worker khi tìm thấy

    Cho N số nguyên dương và một mục tiêu T. M worker chia phần để tìm chỉ-số đầu tiên (nhỏ nhất) i mà a[i] == T. Mỗi worker quét shard riêng, nếu thấy thì gửi chỉ-số qua channel hit. Main dùng select chờ một kết quả; sau khi nhận ít nhất một hit (hoặc tất cả worker xong mà không thấy), đóng channel done để các worker còn lại dừng quét. Vì có thể nhiều worker tìm thấy ở các shard khác nhau, main thu thập tất cả hit đã gửi cho đến khi mọi worker thoát, rồi in chỉ-số nhỏ nhất (1-based). Nếu không tìm thấy, in -1.

    Yêu cầu bổ sung: kết quả phải tất định

    Chương trình bắt buộc phải in ra chỉ-số 1-based nhỏ nhất i thoả a[i] == T, và in -1 nếu không có phần tử nào bằng T.

    Kết quả không được phụ thuộc vào worker nào chạy nhanh hơn hay báo về trước. Với cùng một input, mọi lần chạy phải cho ra cùng một đáp án. Cụ thể:

    • Nhiều worker có thể cùng tìm thấy T trong shard của mình. Chỉ-số mà worker đầu tiên gửi về kênh hit không nhất thiết là chỉ-số nhỏ nhất — lấy ngay giá trị đó là sai.
    • Main phải gom kết quả của mọi worker (đọc kênh hit cho tới khi kênh đóng, sau khi tất cả worker đã thoát) rồi lấy giá trị nhỏ nhất trong số đó.
    • Việc đóng kênh done để huỷ sớm chỉ nhằm tiết kiệm công quét, tuyệt đối không được làm đổi đáp án. Một worker chỉ được phép bỏ dở phần shard còn lại khi mọi chỉ-số nó còn có thể tìm thấy đều lớn hơn kết quả tốt nhất đã biết tại thời điểm đó.

    Gợi ý cách làm tất định: mỗi worker quét shard của mình theo thứ tự chỉ-số tăng dần và gửi về chỉ-số khớp đầu tiên trong shard rồi kết thúc (như vậy mỗi worker gửi tối đa một giá trị, kênh hit với bộ đệm M không bao giờ bị nghẽn). Main nhận hết mọi giá trị, lấy min, rồi in ra min + 1.

    • Định dạng đầu vào:

      Dòng 1: N M T (1 ≤ M ≤ 16, 1 ≤ N ≤ 10^5, |T| ≤ 10^9). Dòng 2: N số nguyên.

    • Ràng buộc đầu vào:

      N ≤ 10^5; M ≤ 16

    • Định dạng đầu ra:

      Một số nguyên: chỉ-số 1-based nhỏ nhất chứa T, hoặc -1.

    Ví dụ:

    Đầu vào:

    8 3 7
    1 2 7 3 7 4 7 5
    

    Đầu ra:

    3

    Giải thích:

    Các vị trí (0-based) có giá trị 7: 2,4,6. Worker shard khác nhau có thể đều gửi hit; main lấy min = 2 -> in 1-based = 3.

    Chủ đề

    🐹 GoGoGo: ConcurrencyTất cả môn học

    Đang tải editor...