Hướng dẫn giải của Thi Đấu Mười Môn
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 viết lời giải.
Nộp một lời giải chính thức trước khi tự giải là một hành động có thể bị ban.
Nộp một lời giải chính thức trước khi tự giải là một hành động có thể bị ban.
Lời giải: Thi Đấu Mười Môn
Hướng tiếp cận
Bài toán yêu cầu phân thí sinh vào môn thi (hoán vị) sao cho tổng điểm + thưởng lớn nhất. Với , ta dùng DP bitmask.
Nhận xét quan trọng
- Xét phân công từng môn thi theo thứ tự . Khi phân xong môn đầu, ta biết tập thí sinh đã được chọn (bitmask) và tổng điểm môn đầu.
- Phần thưởng chỉ phụ thuộc vào tổng điểm môn đầu tiên. Khi ta vừa phân xong môn , ta kiểm tra các bonus có .
- Trạng thái DP: = tổng điểm tối đa khi đã phân các thí sinh trong vào môn đầu tiên ( = popcount).
Thuật toán
- Khởi tạo , còn lại .
- Duyệt mọi từ đến :
- Đặt (số môn đã phân).
- Với mỗi thí sinh chưa dùng ():
- Thí sinh thi môn , được điểm.
- .
- .
- Kiểm tra bonus: với mỗi bonus có , nếu thì .
- Cập nhật .
- Đáp án: .
Độ phức tạp
- Thời gian:
- Bộ nhớ:
Với : — vừa đủ trong 2 giây với C++.
Bình luận