Professional Documents
Culture Documents
Bình Định
Bài B. THREEJUG
Bài C. WATCHING
Bài D. FARM
Bài G. TAXI
Bài H. BCA
Bài I. Binarylist
Bài K. HIST
Bài L. POSTMAN
Bài A. SQUARE
Bài B. THREEJUG
Bài C. WATCHING
Bài D. FARM
Bài G. TAXI
Bài H. BCA
Bài I. Binarylist
Bài K. HIST
Bài L. POSTMAN
SQUARE
Bài B. THREEJUG
Bài C. WATCHING
Bài D. FARM
Bài G. TAXI
Bài H. BCA
Bài I. Binarylist
Bài K. HIST
Bài L. POSTMAN
THREEJUG
Có 3 bình dung tích A, B, C (lít) với lượng nước ban đầu tương
ứng là a, b, c (lít). Mỗi bước được phép đổ đúng d lít từ một bình
i sang một bình j khác với điều kiện lượng nước hiện có trong bình
i lớn hơn hoặc bằng d và sau khi đổ hết d lít từ bình i sang bình j
thì nước trong bình j không bị tràn ra ngoài. Hãy tìm dãy ít nhất
các bước đổ nước sao cho lượng nước còn lại ở 1 trong 3 bình
đúng bằng T .
Thuật toán 60 điểm
0 ≤ A, B, C , a, b, c, d, T ≤ 105 .
Bài toán đưa về giải 3 phương trình riêng biệt và đưa ra nghiệm
nhỏ nhất trong 3 phương trình đó:
a + dx = T
b + dy = T
c + dz = T
Với mỗi phương trình, sử dụng phương pháp tham lam để thử đổ
xem có thoả mãn điều kiện đề bài không.
Bài A. SQUARE
Bài B. THREEJUG
Bài C. WATCHING
Bài D. FARM
Bài G. TAXI
Bài H. BCA
Bài I. Binarylist
Bài K. HIST
Bài L. POSTMAN
WATCHING
Vào thời điểm 0, Bờm sẽ bật TV và bắt đầu xem loạt phim
"Avengers" trên kênh A. Nếu bất cứ lúc nào trên kênh truyền hình
mà Bờm đang xem có quảng cáo bắt đầu, thì Bờm sẽ chuyển sang
kênh kia và xem kênh đó. Nếu Bờm chuyển kênh và cũng có một
quảng cáo đang diễn ra vào lúc này, thì anh ấy sẽ không chuyển
kênh với hy vọng rằng quảng cáo sẽ sớm kết thúc trên kênh này.
Vào thời điểm t, Bờm sẽ tắt TV và đi ngủ.
Cho biết lịch chiếu quảng cáo cụ thể và thời lượng của các quảng
cáo trên hai kênh, hãy xác định xem Bờm sẽ xem mỗi bộ phim bao
nhiêu đơn vị thời gian.
Thuật toán 40 điểm
Bài B. THREEJUG
Bài C. WATCHING
Bài D. FARM
Bài G. TAXI
Bài H. BCA
Bài I. Binarylist
Bài K. HIST
Bài L. POSTMAN
FARM
Một trang trại trồng và cung cấp rau sạch ra thị trường cần lập kế
hoạch sản xuất cho giai đoạn từ ngày 1 đến ngày n với tổng lượng
hạt giống có để gieo trồng là Q. Do đặc tính thời vụ, nên khi gieo
trồng 1 đơn vị hạt giống vào ngày i thì sẽ thu được một sản lượng
là ai . Kế hoạch sản xuất sẽ bao gồm các đợt gieo trồng, mỗi đợt
sẽ cần tính toán gieo trồng một lượng hạt giống là bao nhiêu và
vào ngày nào. Do đặc tính sinh trưởng và thu hoạch của rau nên 2
đợt trồng liên tiếp cách nhau ít nhất K ngày: cụ thể nếu đợt thứ
nhất bắt đầu gieo trồng vào ngày thứ i thì đợt gieo trồng tiếp theo
sẽ chỉ có thể thực hiện từ ngày i + K trở đi. Ngoài ra, số đơn vị
hạt giống gieo trồng trong mỗi đợt không vượt quá hằng số P cho
trước.
Hãy tính toán kế hoạch sản xuất sao cho tổng sản lượng rau thu
được là lớn nhất.
Thuật toán 50 điểm
n, Q, P ≤ 100.
Độ phức tạp O(n4 ).
Thuật toán 70 điểm
n, Q, P ≤ 1000.
Qui hoạch động 3 chiều theo n, Q, P. Độ phức tạp O(n3 ).
Thuật toán 100 điểm
1 ≤ n ≤ 104 , 1 ≤ K ≤ 10, 1 ≤ Q, P ≤ 104 ;
a1 , . . . , an (1 ≤ ai ≤ 103 )
I Bài toán có thể biến đổi thành tìm tập con có tối đa Q/P
phần tử với tổng lớn nhất. Do đó có thể giảm bớt một chiều
qui hoạch động theo chỉ số P.
I Gọi dp(i, j) là sản lượng lớn nhất làm đến ngày i và đến đợt j.
dp(i, j) = MAX (
dp(i − 1, j), nếu ngày i không trồng,
dp(i − k, j − 1) + a[i], nếu trồng ngày i thì phải cách ra K
ngày, 1 ≤ j ≤ R = Q/P là số đợt tối đa.
)
I Sau đó truy vết với sản lượng max thu được, đầy sản lượng
mỗi ngày được chọn vào mảng sắp xếp tăng dần, và chọn
tham lam từ sản lượng ngày lớn nhất trở về sao cho mỗi đợt
không quá P và tổng không quá Q.
Bài A. SQUARE
Bài B. THREEJUG
Bài C. WATCHING
Bài D. FARM
Bài G. TAXI
Bài H. BCA
Bài I. Binarylist
Bài K. HIST
Bài L. POSTMAN
TAXI
Một taxi tải phải phục vụ N yêu cầu 1, . . . , N trong đó yêu cầu i
có điểm đón i và điểm trả hàng i + N. Taxi xuất phát từ điểm 0,
phục vụ N yêu cầu trên và quay trở lại điểm 0. Khoảng cách giữa
các điểm được cho bởi một ma trận d(2N+1)×(2N+1) trong đó di,j
là khoảng cách từ điểm i tới điểm j (0 ≤ i, j ≤ 2N). Hãy tìm hành
trình của taxi không được lặp lại đỉnh trừ đỉnh xuất phát và có
tổng khoảng cách nhỏ nhất. Biết rằng giá trị này không vượt quá
109 .
Nếu mở rộng bài toán là cho phép lặp lại đỉnh, thì cần floyd tìm
đường đi ngắn nhất giữa hai đỉnh –> yêu cầu thêm truy vết!
Cách 1: Duyệt nhánh cận, floyd trước tính cận.
Cánh 2: Qui hoạch động giống bài toán người du lịch. Một hành
trình vẫn là một hoán vị của 2xn số.
Bài toán người du lịch: Công thức Qui hoạch động
I Không mất tính tổng quát giả sử chu trình bắt đầu và kết
thúc tại đỉnh 0
I Làm thế nào để đưa ra được chính xác hành trình của người
du lịch?
Bài A. SQUARE
Bài B. THREEJUG
Bài C. WATCHING
Bài D. FARM
Bài G. TAXI
Bài H. BCA
Bài I. Binarylist
Bài K. HIST
Bài L. POSTMAN
03. BCA
I Có n khóa học và m giáo viên, mỗi giáo viên có danh sách các
khóa có thể dạy.
I Có danh sách các khóa học không thể để cùng một giáo viên
dạy do trùng giờ.
I Load của một giáo viên là số khóa phải dạy của giáo viên đó.
I Yêu cầu: Tìm cách xếp lịch cho giáo viên sao cho Load tối đa
của các giáo viên là tối thiểu.
Thuật toán I
I Sử dụng thuật toán vét cạn, duyệt toàn bộ khóa học, xếp
giáo viên dạy khóa học đó.
I Sử dụng thuật toán nhánh cận:
I Chọn khóa học chưa có người dạy có số giáo viên dạy ít nhất
để phân công trước.
I Nếu phân công cho giáo viên A môn X, mọi môn học trùng
lịch với môn X không thể được dạy bởi giáo viên A sau này.
I Nếu maxLoad hiện tại lớn hơn minLoad tối ưu thu được trước
đó thì không duyệt nữa.
Code
Bài B. THREEJUG
Bài C. WATCHING
Bài D. FARM
Bài G. TAXI
Bài H. BCA
Bài I. Binarylist
Bài K. HIST
Bài L. POSTMAN
Liệt kê xâu nhị phân - Binarylist
Bài B. THREEJUG
Bài C. WATCHING
Bài D. FARM
Bài G. TAXI
Bài H. BCA
Bài I. Binarylist
Bài K. HIST
Bài L. POSTMAN
02. HIST
I Nhận xét: Một hình chữ nhật với hai biên là các cột thứ i và j
có diện tích là (j − i + 1) ∗ min(li , ..., lj )
I Dễ dàng nhận thấy thuật toán O(N 3 ): thử hết các cặp i và j
và tính min 1 đoạn trong O(N)
I Nhận xét min(li , ..., lj ) = min(min(li , ..., lj−1 ), lj )
I Vậy min đoạn i đến j có thể cập nhật trong O(1) khi i giữ
nguyên và j tăng lên 1, ta có thuật toán O(N 2 )
Thuật toán
I Vấn đề còn lại là làm sao tính nhanh được các giá trị lefti và
righti
I => Sử dụng stack
I Ví dụ với left, ta duyệt i tăng dần, luôn duy trì một stack
chứa vị trí trước i và có độ cao nhỏ hơn cột i, trong đó các vị
trí tăng dần và top của stack lưu vị trí lớn nhất. Như vậy lefti
chính là giá trị trên đỉnh stack khi ta duyệt đến i.
I Cập nhật stack: khi nào mà li <= lstacktop thì pop phần tử
đỉnh stack. Sau đó push i vào stack
I Độ phức tạp O(N), vì một phần tử chỉ vào và ra stack tối đa
1 lần.
Code
Bài B. THREEJUG
Bài C. WATCHING
Bài D. FARM
Bài G. TAXI
Bài H. BCA
Bài I. Binarylist
Bài K. HIST
Bài L. POSTMAN
02. POSTMAN
I Một nhân viên giao hàng cần nhận các kiện hàng tại trụ sở
công ty ở vị trí x = 0, và chuyển phát hàng đến n khách
hàng, được đánh số từ 1 đến n.
I Người khách thứ i ở vị trí xi và cần nhận mi kiện hàng.
I Nhân viên giao hàng chỉ có thể mang theo tối đa k kiện hàng
mỗi lần.
I Nhân viên giao hàng xuất phát từ trụ sở, nhận một số kiện
hàng và di chuyển theo đại lộ để chuyển phát cho một số
khách hàng. Khi giao hết các kiện hàng mang theo, nhân viên
lại quay trở về trụ sở và lặp lại công việc nói trên cho đến khi
chuyển phát hết tất cả các kiện hàng.
I Sau khi giao xong, nhân viên cần quay lại công ty để nộp hóa
đơn của ngày hôm đó.
I Giả thiết là: tốc độ di chuyển là 1 đơn vị khoảng cách trên
một đơn vị thời gian. Thời gian nhận hàng ở trụ sở công ty và
thời gian bàn giao hàng cho khách được coi là bằng 0.
I Giả sử thời điểm nhân viên giao hàng bắt đầu công việc là 0.
I Tìm cách hoàn thành công việc tại thời điểm sớm nhất.
Thuật toán
40 ...
41 // Sap xep khach hang trong tap theo khoang cach
42 sort ( negCus + 1 , negCus + nn + 1);
43 sort ( posCus + 1 , posCus + np + 1 , greater < pii >());
44
45 // Tinh khoang thoi gian nho nhat voi moi tap
46 long long negSeg = calSegment ( negCus , nn , k );
47 long long posSeg = calSegment ( posCus , np , k );
48 ans = negSeg + posSeg ;
49 cout << ans ;
50 return 0;
51 }
Tính đúng đắn
Gọi:
I S ∗ là lời giải tối ưu bất kỳ thoả mãn ràng buộc tất cả khách
được giao hết hàng.
I |S| là tổng thời gian di chuyển của lời giải S.
Tính đúng đắn (tiếp)
Bổ đề 1
Gọi S ∗ (X ) là lời giải tối ưu thu được trên tập khách hàng X . Ta
có:
|S ∗ ({xi |xi > 0})| + |S ∗ ({xi |xi > 0})| = |S ∗ |
Proof. Dễ thấy, với mỗi chuyến hàng đi qua điểm 0 trong lời giải
tối ưu, ta có thể chia thành hai chuyến hàng với một chuyến đi
sang chiều dương, một chuyến hàng qua chiều âm mà thời gian
không đổi (thời gian bốc hàng và dỡ hàng = 0).
Tính đúng đắn (tiếp)
Xét tập khách hàng chỉ ở một chiều (dương hoặc âm), ta chứng
minh tính đúng đắn của lời giải tham lam trên chiều dương
(xi > 0, ∀x).
Tính đúng đắn (tiếp)
Gọi:
I S là lời giải thu được từ thuật toán tham lam ở trên.
I c(S) là số chuyến xe phải đi của lời giải S.
Tính đúng đắn (tiếp)
Bổ đề 2
Số chuyến xe phải đi để giao hết hàng cho toàn bộ khách hàng của
lời giải tham lam S là ít nhất.
c(S) ≤ c(S ∗ ), ∀S ∗
Proof. Theo phép xây dựng lời giải của thuật tham lam, ta có:
Pn
1 mi
c(S) = ≤ c(S ∗ )
K
Tính đúng đắn (tiếp)
Gọi t(i, S) là tổng thời gian di chuyển của i chuyến xe đầu tiên.
Chú ý, không mất tính tổng quát, các chuyến xe được đánh số thứ
tự theo thời gian di chuyển giảm dần (chuyến xe đi xa nhất đi đầu
tiên).
I t(1, S) = 2x4
I t(2, S) = 2x4 + 2x3
I ...
Chú ý: các chuyến xe chỉ xét đến quãng đường phải di chuyển,
chưa quan tâm đến phải các điểm thả hàng của mỗi chuyến.
Tính đúng đắn (tiếp)
Bổ đề 3
S ∗ là lời giải tối ưu bất kỳ. Ta có:
t(i, S) ≤ t(i, S ∗ ), ∀i
Proof.
I t(1, S) = t(1, S ∗ ) = 2xn
I Giả sử t(i, S) ≤ t(i, S ∗ ), ta chứng minh:
t(i + 1, S) ≤ t(i + 1, S ∗ )
Có:
(
t(i + 1, S) = t(i, S) + 2xl
(1)
t(i + 1, S ∗ ) = t(i, S ∗ ) + 2xl ∗
Tính đúng đắn (tiếp)
Proof. (tiếp) Theo phép xây dựng lời giải của thuật tham lam, ta
có:
Xn
0
ml + mj = i × k, 0 ≤ ml0 ≤ ml (2)
l+1
|S| = |S ∗ |
Proof.
(⇒) Theo giả thiết S ∗ là tối ưu, ta có |S| ≥ |S ∗ |.
(⇐) Ta chứng minh |S| ≤ |S ∗ |:
I Theo bổ đề 2, ta có:
c(S) ≤ c(S ∗ )
I Theo bổ đề 3, ta có