Hướng dẫn giải của HSG THPT Hải Phòng 2022 - Bài 2


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.

Subtask 1

Chỉ có 2 số ~a~ và ~b~ nên ta chỉ cần lần lượt ghép ~a~ trước ~b~ rồi ~b~ trước ~a~, rồi so sánh xem 2 lần ghép đấy lần nào cho kết quả lớn hơn.

Subtask 2

Với 2 số tự nhiên bất kỳ có cùng số chữ số, xét từ chữ số hàng lớn nhất đến nhỏ nhất (trái qua phải) cho đến khi tại hàng đó 2 chữ số đó khác nhau, ta biết rằng chữ số bên nào lớn hơn tức là số bên đấy lớn hơn. Do đó, ta sẽ cố gắng làm cho chữ số đầu tiên của kết quả lớn nhất có thể bằng cách chọn số có chữ số trái cùng lớn nhất trong tất cả các số, rồi lần lượt làm như vậy với các số còn lại.

Vì các số trong subtask này đều có cùng số chữ số, số nào có phần tiền tố lớn hơn ắt hẳn sẽ có giá trị lớn hơn, nên ta chỉ cần sắp xếp các số theo thứ tự từ lớn đến bé rồi in chúng ra mà không có khoảng cách. Lưu ý rằng điều này không nhất thiết đúng khi các số có số chữ số khác nhau, ví dụ như số ~9~ và số ~845~.

Subtask 3 + 4

Các số bây giờ đã không còn cùng số chữ số, tuy nhiên để ý rằng khi ta ghép các số lại với nhau thì dù ghép theo thứ tự nào thì số cuối cùng sẽ luôn có cùng số lượng chữ số. Từ đó ta có thể biết được số nào nên đứng trước giữa 2 số bằng cách ghép chúng theo hai thứ tự khác nhau, rồi so sánh xem cách ghép nào cho giá trị lớn hơn.

Để ra kết quả ta áp dụng cách sắp xếp trên vào một thuật toán sắp xếp bất kỳ mà ta đang dùng trên dãy giá trị của ta. Vì giới hạn lớn của subtask 4 (~n \leq 10000~) nên ta có thể dùng một thuật toán sắp xếp có độ phức tạp tốt hơn để làm, ví dụ như Quick Sort hay Merge Sort.


Bình luận

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



  • -13
    YuukaKazami  đã bình luận lúc 6, Tháng 1, 2024, 4:25

    Bình luận này đã bị ẩn vì có quá nhiều phản ứng tiêu cực. Nhấn để xem.