CAR - Lập lịch sửa chữa ô tô

Tags: sortings, greedy

Problem

https://vn.spoj.com/problems/CAR

https://oj.vnoi.info/problem/CAR

Một cơ sở sửa chữa ô tô có nhận n chiếc xe để sửa. Do các nhân viên làm việc quá lười nhác nên đã đến hạn trả cho khách hàng mà vẫn chưa tiến hành sửa được chiếc xe nào. Theo hợp đồng đã ký kết từ trước, nếu bàn giao xe thứ i quá hạn ngày nào thì sẽ phải trả thêm một khoản tiền phạt là A[i].
Ông chủ cơ sở sửa chữa quyết định sa thải toàn bộ công nhân và thuê nhân công mới. Với lực lượng mới này, ông ta dự định rằng để sửa chiếc xe thứ i sẽ cần B[i] ngày. Vấn đề đặt ra đối với ông là phải lập lịch sửa tuần tự các chiếc xe sao cho tổng số tiền bị phạt là ít nhất.

Yêu cầu: Hãy lập lịch sửa xe giúp cho ông chủ cơ sở sửa chữa ô tô.

Download test và solution tại đây.

Input

  • Dòng 1: Chứa số n (n ≤ 10000)
  • Dòng 2: Chứa n số nguyên dương A[1], A[2], …, A[n] (1 ≤ A[i] ≤ 10000)
  • Dòng 3: Chứa n số nguyên dương B[1], B[2], …, B[n] (1 ≤ B[i] ≤ 100)

Output

  • Dòng 1: Ghi số tiền bị phạt tối thiểu
  • Dòng 2: Ghi số hiệu các xe sẽ tiến hành sửa chữa, theo thứ tự từ xe được sửa đầu tiên đến xe sửa sau cùng

Example

Input
4
1 3 4 2
3 2 3 1

Output
44
4 2 3 1 

Xong công việc 4 vào cuối ngày 1 => phải trả 2 * 1 = 2 .
Xong công việc 2 vào cuối ngày 3 => phải trả 3 * 3 = 9.
Xong công việc 3 vào cuối ngày 6 => phải trả 6 * 4 = 24 .
Xong công việc 1 vào cuối ngày 9 => phải trả 1 * 9 = 9 .
Vậy tổng cộng phải trả 44 .


Tutorial

Xét một công việc (cv) i, ta nhận thấy nó có “độ đắt” là a[i]/b[i] ta sắp xếp ưu tiên những cv “đắt” trước để hoàn thành trước, những cv còn lại hoàn thành sau thì chi phí cần trả sẽ là nhỏ nhất.

Để tính chi phí cần trả, ta tính tổng tất cả giá tiền trong một ngày của n cv. Cứ hoàn thành xong một cv thì trừ dần tiền trả đi.

Do test output chấm theo thứ tự các cv là cố định nên thuật QuickSort cài bằng Pascal có thể không chuẩn, nên tốt nhất là sort bằng C++.


Submission