canuc80k0334·35/50

Ghép Thành Số Lớn Nhất

Nộp bài trên LQDOJ

Bài 03 · Sorting

Có tấm thẻ, mỗi thẻ ghi một số nguyên dương. Bạn phải xếp toàn bộ thẻ thành một hàng rồi đọc liền các biểu diễn thập phân từ trái sang phải, không chèn khoảng cách. Ví dụ, đặt thẻ trước thẻ tạo đoạn chữ số , còn đổi thứ tự tạo . Hãy tìm chuỗi chữ số biểu diễn số lớn nhất có thể thu được. Vì mọi dương, kết quả không có chữ số vô nghĩa ở đầu.

Input

  • Dòng đầu chứa số nguyên . Dòng thứ hai chứa số nguyên .

Output

  • In chuỗi chữ số lớn nhất tạo được sau khi dùng mỗi thẻ đúng một lần.

Constraints

  • Mỗi thẻ phải được dùng đúng một lần

Scoring

  • Subtask ( điểm): .
  • Subtask ( điểm): Theo đầy đủ các giới hạn đã nêu.

Example

Test 1

Input

5
9 91 34 3 30

Output

99134330

Giải thích: So sánh từng cặp bằng hai cách ghép cho thứ tự . Ghép theo thứ tự đó tạo , lớn hơn mọi hoán vị khác.

Lời giải tóm tắt
  • Ý tưởng: Với hai chuỗi số x,y, phần trước và sau của chúng trong kết quả không đổi. Vì vậy chỉ cần so sánh xy với yx: cách ghép lớn hơn cho biết phần tử nào nên đứng trước.
  • Thuật toán: Đọc các số dưới dạng chuỗi. Sort bằng comparator x+y > y+x, sau đó nối các chuỗi theo thứ tự đã sort.
  • Chứng minh tính đúng đắn: Nếu hai phần tử kề x,y đang có yx>xy nhưng x đứng trước y, đổi chỗ chúng làm toàn bộ kết quả lớn hơn vì tiền tố và hậu tố giữ nguyên. Do đó một phương án tối ưu không thể có nghịch thế theo comparator. Thứ tự đã sort không có nghịch thế; từ bất kỳ hoán vị nào, đổi dần các cặp sai không làm giảm kết quả và dẫn đến một thứ tự sort. Vậy chuỗi thuật toán tạo ra là lớn nhất.
  • Độ phức tạp: O(N log N · L) thời gian, với L≤4 là độ dài hai chuỗi ghép khi so sánh; O(N) chuỗi bộ nhớ.