Download as pdf or txt
Download as pdf or txt
You are on page 1of 3

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à 𝑛 .

- Sắp xếp dãy 𝑎1 , 𝑎2 , … , 𝑎𝑛 tăng dần.


𝑚
- Số tiền thu của người đầu tiên sẽ là 𝑥1 = 𝑚𝑖𝑛(𝑎1 , 𝑛 ).
 Cần thu số tiền 𝑚 − 𝑥1 của 𝑛 − 1 người , vậy số tiền cần thu của người thứ 2 là
𝑚−𝑥
𝑥2 = min(𝑎2 , 𝑛−11 )….
𝑚− ∑(𝑥1..𝑖−1 )
 Người thứ 𝑖 sẽ thu số tiền là 𝑥𝑖 = min(𝑎𝑖 , )
𝑛−𝑖+1
 Có thể làm giảm độ phức tạp tính toán bằng cập nhật lại 𝑚 − ∑(𝑥1..𝑖−1 ) mỗi khi tính
được 𝑥𝑖 : 𝑚 = 𝑚 − 𝑥𝑖 .
 Cần 𝑛 phép tính sẽ tính được lần lượt 𝑥1 , 𝑥2 , … , 𝑥𝑛
Lưu ý:
- Vì số tiền là số nguyên nên phép chia được sử dụng là phép lấy phần nguyên.
- Kết quả cần in ra số tiền cần đóng góp của mỗi người nên việc sắp xếp sẽ làm mất đi trật tự
ban đầu, cần có phương pháp để lưu lại và in ra theo đúng thứ tự ban đầu.
- Độ phức tạp của bài toán là độ phức tạp của thuật toán sắp xếp: 𝑂(𝑛𝑙𝑜𝑔𝑛)
Lời giải bài BRIDGE
- Sắp xếp các xe thành 2 danh sách: xe cần sang cầu từ bờ A (có 𝑛𝐴 xe) và xe cần sang cầu từ
bờ B (có 𝑛𝐵 xe).
- Sử dụng phương pháp Quy hoạch động tìm thời gian tối ưu khi xe thứ 1. . 𝑖 từ bờ 𝐴 và 1. . 𝑗
từ bờ 𝐵 đã qua cầu:
o Gọi f[A, i, j], là thời gian ít nhất để các 𝑖 xe bờ A và 𝑗 xe bờ B qua cầu và xe cuối
cùng qua cầu là xe thứ 𝑖 ở bờ A.
o Gọi f[B, i, j] là thời gian ít nhất để các 𝑖 xe bờ A và 𝑗 xe bờ B qua cầu và xe cuối cùng
qua cầu là xe thứ 𝑗 ở bờ B
Khi đó, thời gian qua cầu của các xe k: j + 1..nB được tính bằng công thức:
Xe j + 1: startTime = max(f[A, i, j], a[B,j + 1]); //thời điểm xe i bên bờ A qua cầu hoặc
thời điểm xe j + 1 đến chân cầu.
endTime = startTime + d[B, j + 1];//thời điểm bắt đầu + thời gian qua cầu của xe j
+1
 f[B, i, j + 1] = min(f[B, i, j + 1] , endTime); //lấy min trong các cách đi
Xe từ j + 2…nB: //Các xe xuất phát nối đuôi nhau và cách nhau 1 khoảng thời gian =
delay:
//Tính thời gian theo phương án mới:
startTime = max(startTime + delay, a[B, k]);
endTime = max(endTime + delay, startTime + d[B, k]);
//Lấy tối ưu
f[1, i, k] = min(f[1, i, k], endTime);
Tương tự, tính thời gian qua cầu của các xe i + 1…nA:
Với xe i + 1:
startTime = max(f[B, i, j], a[A, i + 1]);
endTime = startTime + d[A, i + 1];
f[A, i + 1 , j] = min(f[A, i + 1, j], endt);
Xe từ i + 2…nA: //Các xe xuất phát nối đuôi nhau và cách nhau 1 khoảng thời gian =
delay:
//Tính thời gian theo phương án mới:
startTime = max(startTime + delay, a[A, k]);
endTime = max(endt + delay, startTime + d[A, k]);
//Lấy tối ưu
f[A, k, j] = min(f[A, k, j], endTime);

- Thời gian thực hiện giải thuật: 𝑂(𝑛3 )


Lời giải bài SERVICE
Quy ước : d(u,v) là độ dài đường đi xuất phát từ đỉnh u tới đỉnh v trong cây.
Tính chất 1 : Trong phương án tối ưu, hai thành phố được chọn phải thuộc đường đi dài nhất
của cây. (Đường đi dài nhất trong cây là đường đi xuất phát từ 1 đỉnh u và kết thúc tại đỉnh v sao
cho tổng chiều dài quãng đường là dài nhất có thế).
Chứng minh: Giả sử đường đi từ u tới v là đường đi dài nhất trong đồ thị, có đỉnh s thuộc
đường đi dài nhất đó thì ∆(𝑠) = max(𝑑(𝑢, 𝑠), 𝑑(𝑠, 𝑣)). Nếu chọn 1 đỉnh s’ nằm ngoài đường đi,
và đỉnh s thuộc đường đi u tới v gần s’ nhất, hay d(s,s’) là khoảng cách từ đỉnh s’ tới đường đi u-
>v.
Lúc này ∆(𝑠′) = 𝑑(𝑠, 𝑠 ′ ) + max(𝑑(𝑢, 𝑠), 𝑑(𝑠, 𝑣)). Do đó, thay vì chọn s’, ta chọn s sẽ mang lại
kết quả ∆ tối ưu.
Tính chất 2 : Hai thành phố được chọn chia nửa độ dài đường đi dài nhất.
Dễ thấy là để khoảng cách ∆ nhỏ nhất thì cần phải đặt 2 thành phố tại cạnh mà nó chia đôi độ dài
đường đi dài nhất.

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.

You might also like