canuc80k0602·3/50

Ghép Kích Thước

Nộp bài trên LQDOJ

Bài 06 · Two Pointers

Có yêu cầu với các kích thước mong muốn và tài nguyên có kích thước . Một yêu cầu có kích thước có thể được ghép với một tài nguyên kích thước khi .

Mỗi yêu cầu và mỗi tài nguyên chỉ được dùng trong nhiều nhất một cặp. Hãy tìm số cặp lớn nhất có thể tạo.

Input

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

Output

  • In ra một số nguyên - số cặp lớn nhất có thể tạo.

Constraints

  • .
  • .
  • .

Scoring

  • Subtask ( số điểm): .
  • Subtask ( số điểm): Không có giới hạn bổ sung.

Example

Test 1

Input

6 5 3
30 41 44 50 65 70
28 39 46 67 80

Output

4

Giải thích: Có thể ghép các cặp kích thước và . Không thể tạo cặp thứ năm, nên đáp án là .

Lời giải tóm tắt
  • Phân tích: Sau khi sắp xếp, ta luôn xét yêu cầu nhỏ nhất và tài nguyên nhỏ nhất chưa xử lý. Nếu tài nguyên quá nhỏ, nó không thể hợp với bất kỳ yêu cầu nào về sau. Nếu nó quá lớn, yêu cầu hiện tại không thể hợp với bất kỳ tài nguyên nào về sau.
  • Thuật toán: Sắp xếp hai dãy tăng dần và đặt hai con trỏ ở đầu. Loại phần tử chắc chắn quá nhỏ hoặc quá lớn theo ba trường hợp; khi chênh lệch không vượt k, tạo một cặp và tăng cả hai con trỏ.
  • Chứng minh đúng: Hai trường hợp loại bỏ là bắt buộc do thứ tự tăng dần. Khi hai phần tử nhỏ nhất hiện tại ghép được, mọi nghiệm tối ưu có thể được biến đổi để ghép chúng với nhau mà không giảm số cặp: thay đối tác muộn hơn bằng phần tử nhỏ hơn chỉ làm điều kiện chênh lệch dễ thỏa hơn. Quy nạp trên số phần tử còn lại cho kết quả tối ưu.
  • Độ phức tạp: O(n log n + m log m) thời gian và O(n+m) bộ nhớ lưu dữ liệu.