canuc80k0447·48/50

Cắt Thanh Theo Danh Sách

Nộp bài trên LQDOJ

Bài 0.5 · Greedy

Bạn có một thanh dài . Cần cắt nó thành đúng đoạn có độ dài ; tổng các độ dài này bằng .

Trong một thao tác, chọn một đoạn hiện có và cắt nó thành hai đoạn có độ dài nguyên dương. Chi phí của thao tác bằng độ dài của đoạn trước khi cắt.

Hãy tìm tổng chi phí nhỏ nhất để thu được đúng multiset độ dài yêu cầu.

Input

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

Output

  • In tổng chi phí nhỏ nhất.

Constraints

  • .
  • .
  • với mọi .
  • .

Scoring

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

Example

Test 1

Input

10 4
1 2 3 4

Output

19

Giải thích: Có thể tạo hai đoạn bằng cách tách theo chiều ngược tương ứng với các lần ghép , rồi . Tổng chi phí là .

Lời giải tóm tắt
  • Ý tưởng: Đảo chiều quá trình: bắt đầu từ các đoạn cuối và ghép hai đoạn thành một. Ghép u và v có chi phí u+v, đúng bằng chi phí của lần cắt đoạn u+v tương ứng.
  • Ý tưởng: Trong một cây ghép tối ưu, hai trọng số nhỏ nhất có thể đặt ở hai lá sâu nhất và là anh em; nếu một trọng số lớn hơn nằm sâu hơn, đổi chỗ không làm tăng chi phí. Vì vậy ta luôn ghép hai đoạn ngắn nhất, đưa tổng trở lại min-heap và lặp lại.
  • Ý tưởng: Độ phức tạp là O(n log n) thời gian và O(n) bộ nhớ.