Hướng dẫn giải của VQ15 Cỗ bài

Chỉ dùng lời giải này khi không có ý tưởng, và đừng copy-paste code từ lời giải này. Hãy tôn trọng người ra đề và người làm lời giải.


Nộp code mẫu trước khi tự giải được bài tập là một hành vi có thể bị ban.

Nhận xét: Nếu bài toán có lời giải với yêu cầu hạ các quân bài tạo thành dãy ~1, 2, . . ., x~ thì cũng có lời giải khi yêu cầu hạ các quân bài tạo thành dãy ~1, 2, . . ., y~ với ~y < x~ vì vậy có thể tìm ~max(x)~ theo giải thuật tìm kiếm nhị phân trong khoảng ~[0, m]~.

Từ nhận xét trên ta có giải thuật xử lý cho mỗi bộ dữ liệu như sau:

  • B1. Nhập dữ liệu,

  • B2. Tìm ~max(x)~ theo giải thuật tìm kiếm nhị phân trong khoảng ~ [0, m]~,

  • B3. Đưa ra ~max~ tìm được.

Trọng tâm của giải thuật là hàm ~check(u)~ kiểm tra xem có thể hạ bài tạo thành dãy ~1, 2, . . ., u~. Để tiện xử lý ta sẽ ghi số các số trên quân bài bắt đầu từ ~0~. Như vậy khoảng cần xét sẽ là ~[0, m-1]~, các giá trị ai sẽ giảm ~1~ trong lưu trữ.

Giải thuật kiểm tra với giá trị ~u~:

  • Quân bài có số ghi ~x~ ~(x \leq u)~ chưa có thể hạ xuống được gọi là quân bài chờ,

  • Ban đầu số ở các quân bài chờ là ~u, u-1, . . ., u – max(k-1, 0)~,

  • Duyệt các quân bài từ ~n~ lùi về ~1~, nếu gặp quân bài chờ thì xóa dấu hiệu chờ của quân bài đó và bổ sung thêm quân bài chờ mới là ~p-1~, trong đó ~p~ – quân bài chờ hiện tại nhỏ nhất.

  • Số lượng bài chờ bằng ~0~ nghĩa là có thể hạ hết các quân bài theo yêu cầu, giá trị ~u~ có thể đạt được,

  • Trong trường hợp ngược lại, khi duyệt hết cỗ bài mà vẫn còn quân chờ - không thể đạt tới giá trị ~u~.

Độ phức tạp của giải thuật: ~O((n+m)logm)~.


Bình luận

Hãy đọc nội quy trước khi bình luận.


Không có bình luận tại thời điểm này.