Professional Documents
Culture Documents
Lời giải bài SHARE
Lời giải bài SHARE
Cách 1:
∑𝑎𝑖
- Nếu ∑𝑎𝑖 < 𝑀 in ra -1. Ngược lại, tính 𝑝 = 𝑛
- Vì số tiền thu không được quá khả năng của mỗi người và số tiền nhỏ nhất có thể thu là min(p,
số tiền của người có thể góp ít nhất). Vậy ta cần tính xem số tiền lớn nhất cần thu của 1 người
là bao nhiêu để chênh lệch là nhỏ nhất và tổng số tiền đúng bằng M.
Chặt nhị phân để tìm giá trị này,
𝐿 = min(𝑎𝑖 ) , 𝐻 = max(𝑎𝑖 ) , 𝑚𝑖𝑑 = (𝐿 + 𝐻) 𝑑𝑖𝑣 2
Với số tiền cần thu lớn nhất giả định là 𝑚𝑖𝑑: Xét tất cả 𝑎𝑖 , tính 𝑠𝑢𝑚 = 𝑠𝑢𝑚 +
min(𝑎𝑖 , 𝑚𝑖𝑑), nếu 𝑠𝑢𝑚 < 𝑚 số tiền cần thu lớn nhất > 𝑚𝑖𝑑 ta sẽ phải tìm giá trị
này trong khoảng [mid + 1, H], ngược lại, tìm trong khoảng [L, mid].
Cách 2:
𝑚
Số tiền trung bình mỗi người phải đóng góp là 𝑛 .
Cài đặt.
1. Tìm đường đi dài nhất trong cây, có thể sử dụng cách sau:
DFS từ 1 đỉnh bất u kỳ, chọn đỉnh v xa u nhất, sau đó DFS từ đỉnh u, đỉnh xa nhất tới
đỉnh u chính là đoạn đường dài nhất trong cây.
2. Khi có đoạn đường dài nhất, tìm cách đặt 2 thành phố vào vị trí trung tâm của đường đi.