Tài liệu bồi dưỡng học sinh giỏi THPT – Môn Tin học
Phần II: Chuyên đề nâng cao
CHUYÊN ĐỀ NÂNG CAO 5
CHUYÊN ĐỀ 5: PHƯƠNG PHÁP THAM LAM
1. Giới thiệu
Phương pháp tham lam là một mô hình thuật toán dùng để giải quyết bài toán tối ưu tổ hợp.
Phương pháp này xây dựng lời giải của bài toán qua từng bước, tại mỗi bước luôn chọn kết quả tối ưu
nhất cho bước đó.
Ưu điểm: Có thể áp dụng cho bài toán tối ưu, ý tưởng đơn giản, dễ cài đặt.
Hạn chế: thuật toán tham lam không phải khi nào cũng cho kết quả tối ưu.
2. Một số ví dụ
2.1. Ghép cặp số:
Hãy ghép 2n số thành n cặp số sao cho tổng của tích các cặp số là lớn nhất biết rằng mỗi số chỉ
được chọn ghép một lần.
Dữ liệu: n và a[1], a[2],..,a[2n] nhập từ bàn phím.
Kết quả: ghi ra màn hình tổng và các cặp số.
Ví dụ:
Dữ liệu
2
1342
5
1 3 -4 2 0 1
Kết quả
- Tổng: 14
- Các cặp: (1,2); (3,4)
- Tổng: 7
- Các cặp: (-4,0), (1,1); (3,2)
* Phân tích bài toán
input: N, a[1],a[2],..,a[2n]
Output: tổng S, N cặp số
* Ý tưởng thuật toán
Tại mỗi bước chọn cặp (a,b) sao cho a*b lớn nhất có thể.
* Thuật toán
1. Nhập N, a[1],..,a[2n] từ bàn phím.
2. Sắp xếp các a[i] giảm dần.
3. Tham
Tong:=0
For i=1 to n do Tong:=Tong+a[2i-1]*a[2i]
4. In kết quả:
Tổng lớn nhất là: Tong
Cách ghép các số là: (a[2i-1],a[2i]) với i=1…n.
2.2. Mua kẹo:
Siêu thị bày bán n gói kẹo, gói thứ i có giá là a[i] (1<=i<=n). Tí muốn dùng số tiền m để mua kẹo.
Hãy giúp Tí chọn các gói để mua sao cho số gói kẹo mua được nhiều nhất. Nếu cùng mua được số gói
như nhau thì chọn phương án tốn ít nhất.
Dữ liệu: file văn bản MUAKEO.INP
- Dòng đầu ghi 2 số nguyên n và m
- Dòng thứ hai ghi n số nguyên a[1], a[2],..,a[n].
Kết quả: file văn bản MUAKEO.OUT
Giáo viên: Lê Thanh Phú
1|Tra n g
Tài liệu bồi dưỡng học sinh giỏi THPT – Môn Tin học
- Dòng đầu ghi số gói mua được
- Dòng thứ 2: ghi số tiền còn lại sau khi mua.
* Các số trong file cách nhau một dâu cách
Ví dụ:
MUAKEO.INP
35
342
57
13714
Phần II: Chuyên đề nâng cao
MUAKEO.OUT
2
0
3
2
* Phân tích bài toán
input: n, m, a[1],a[2],..,a[n]
Output: số gói S và số tiền còn lại T
* Ý tưởng thuật toán
Khi mua một món quà ta chọn món quà ít tiền nhất có thể.
* Thuật toán
1. Đọc N,M, a[1],..,a[n] từ file
2. Sắp xếp các a[i] tăng dần
3. Tham
S:=0; T:=M;
For i:=1 to n do If T>=a[i] then
S:=S+1;
T:=T-a[i]
4. In kết quả
Ghi vào file trên mỗi dòng lần lượt S và T.
Lưu ý: Sau khi viết chương trình, cần test kỹ lưỡng, xét hết các trường hợp đặc biệt.
3. Một số bài tập vận dụng
3.1. Vắt sữa bò: Ntucoder
Vào một buổi sáng anh Bo sắp một đàn bò gồm n con bò để vắt sữa. Anh dự kiến là vào sáng hôm đó,
con bò thứ i có khả năng sẽ vắt được a i lít sữa. Tuy nhiên đàn bò của anh có đặc tính là cứ mỗi lần vắt
sữa một con, những con còn lại trông thấy sợ quá nên sẽ bị giảm sản lượng mỗi con 01 lít sữa. Nếu vắt
sữa con bò thứ nhất, n-1 con còn lại bị giảm sản lượng. Sau đó vắt sữa con bò thứ hai thì n-2 con còn lại
bị giảm sản lượng.... Bạn hãy giúp anh Bo tính xem thứ tự vắt sữa bò như thế nào để số lượng sữa vắt
được là nhiều nhất nhé.
Dữ liệu vào: gồm 2 dòng
- Dòng thứ nhất là số nguyên n (1 ≤ n ≤ 100) là số lượng con bò.
- Dòng thứ hai gồm n số nguyên a1, a2,..., an (1 ≤ ai ≤ 1000) là sản lượng sữa của các con bò.
Dữ liệu xuất:
- Là một số nguyên xác định số lít sữa nhiều nhất mà anh Bo có thể vắt được.
Ví dụ
input
4
4444
output
10
input
4
Giáo viên: Lê Thanh Phú
2|Tra n g
Tài liệu bồi dưỡng học sinh giỏi THPT – Môn Tin học
Phần II: Chuyên đề nâng cao
2143
output
6
- Trong test 1: vắt sữa con bò 1 (được 4), lượng sữa còn lại là 3 3 3; vắt sữa con bò 2 (được 3), lượng sữa
còn lại là 2 2, vắt sữa con bò 3 (được 2) và con bò 4 (được 1), tổng cộng 10.
- Trong test 2: vắt sữa con bò 1 (được 2), lượng sữa còn lại là 0 3 2; vắt sữa con bò 3 (được 3) và vắt sữa
con bò 4 (được 1) tổng cộng 6.
3.2. Phân tích số
Cho số nguyên dương N. Hãy phân tích N thành tổng các số nguyên dương không lớn hơn N sao cho tích
của chúng lớn nhất.
Dữ liệu: file văn bản PTSO.INP
- Ghi số nguyên n
Kết quả: file văn bản PTSO.OUT
- Dòng đầu ghi m đầu là số lượng các số nguyên dương trong cách phân tích
- Dòng thứ 2 ghi m số tìm được theo thứ tự tăng dần
* Các số trong file cách nhau một dâu cách
Ví dụ:
PTichSO.INP
5
6
PTichSO.OUT
23
33
Giới hạn: 1<=n<=1000000;
3.3. Nối xích: />Người ta có n đoạn dây xích, mỗi đoạn dây xích là chuỗi gồm a[i] (i=1..n) mắt xích được nối với
nhau. Các đoạn dây xích này tách rời nhau. Bằng cách cắt ra một mắt xích, sau đó hàn lại, ta có thể nối
hai dây xích thành một đoạn. Thời gian để cắt và hàn mỗi mắt xích là 1 đơn vị thời gian và được xem là
bằng nhau với mọi mắt xích. Nhiêm vụ của bạn là phải nối chúng lại thành một đoạn dây xích duy nhất
với thời gian ít nhất (hay số mắt xích bị cắt và hàn lại là ít nhất).
Dữ liệu: file văn bản NOIXICH.INP
- Dòng đầu ghi số nguyên n
- Các dòng tiếp theo ghi n số nguyên a[1], a[2],..,a[n]
Kết quả: file văn bản NOIXICH.OUT
- Ghi duy nhất số đơn vị thời gian cần nối n đoạn xích đã cho
* Các số trong file cách nhau một dâu cách
Ví dụ:
NOIXICH.INP
NOIXICH.OUT
3
2
23
4
5
3
12345
Giới hạn: 1<=n<=20000; 1<=a[i]<= 2000;
3.4. Sửa xe: Nguồn: />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] (i=1..n).
Giáo viên: Lê Thanh Phú
3|Tra n g
Tài liệu bồi dưỡng học sinh giỏi THPT – Môn Tin học
Phần II: Chuyên đề nâng cao
Ô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] (i=1..n) 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.
Dữ liệu: file văn bản SUAXE.INP
- Dòng đầu ghi số nguyên n
- Dòng thứ hai ghi n số nguyên a[1], a[2],..,a[n]
- Dòng thứ ba ghi n số nguyên b[1], b[2],..,b[n]
Kết quả: file văn bản SUAXE.OUT
- Dòng đầu ghi một số duy nhất chi phí tối thiểu.
- Dòng thứ hai ghi lần lượt số hiệu các xe cần sửa
* Các số trong file cách nhau một dâu cách
Ví dụ:
SUAXE.INP
SUAXE.OUT
4
44
1342
4231
3231
Giải thích:
• 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 .
Giới hạn: 1<=n<=1000; 1<=a[i]<=100; 1<=b[j]<=100;
3.5. Nối điểm đen trắng: Đề thi HSG quốc gia: />Trên trục số thực cho n điểm đen và n điểm trắng hoàn toàn phân biệt. Các điểm đen có tọa độ
nguyên a[1],a[2],..,a[n] còn các điểm trắng có tọa độ nguyên b[1],b[2],..,b[n]. Người ta muốn chọn ra
k điểm đen và k điểm trắng để nối mỗi một điểm đen với một điểm trắng sao cho k đoạn thẳng tạo được
đôi một không có điểm chung. Hãy tìm giá trị k lớn nhất thỏa mãn yêu cầu trên.
Dữ liệu: file văn bản NOIDIEM.INP
- Dòng đầu ghi số nguyên n
- Dòng thứ hai ghi n số nguyên a[1], a[2],..,a[n]
- Dòng thứ ba ghi n số nguyên b[1], b[2],..,b[n]
Kết quả: file văn bản NOIDIEM.OUT
Ghi duy nhất số k tìm được.
* Các số trong file cách nhau một dâu cách
Ví dụ:
NOIDIEM.INP
3
031
-3 5 -1
Giáo viên: Lê Thanh Phú
4|Tra n g
NOIDIEM.OUT
2
Tài liệu bồi dưỡng học sinh giỏi THPT – Môn Tin học
Phần II: Chuyên đề nâng cao
Giới hạn:
1<=n<=10000; |a[i]|,|b[i]|<=1000000000;
3.6 Xếp phòng thi (Room.pas)
Đề thi HSG 2015.
Trong một lần tổ chức Olympic Tin học sinh viên, có N cuộc thi được đánh số từ 1 đến N. Cuộc thi
thứ I có thời điểm bắt đầu là Si và kết thúc là Fi. Tại mỗi thời điểm trong mỗi phòng thi có không quá một
cuộc thi diễn ra ngoại trừ trường hợp thời điểm kết thúc một cuộc thi có thể đồng thời là thời điểm bắt
đầu của một cuộc thi khác.
Hãy xếp phòng thi cho tất cả các cuộc thi sao cho số phòng cần sử dụng là ít nhất.
Dữ liệu vào: Từ file văn bản Room.inp gồm:
- Dòng thứ nhất ghi số nguyên dương N (n<=1000)
- Trên dòng thứ i trong N dòng tiếp theo là hai số nguyên Si và Fi .
Dữ liệu ra: Ghi kết quả vào tệp Room.out là số phòng cần sử dụng.
Room.inp
Room.out
5
2
02
12
34
25
45
3.7 Trò chơi bốc bài:
Tí và Tèo chơi bốc bài như sau: trên bàn có N lá bài (N ≤ 10 3) xếp thành một hàng, trên mỗi lá bài có ghi
số nguyên dương Qi (1 ≤ i ≤ N), các số là phân biệt. Tí và Tèo luân phiên nhau chơi, mỗi người tới lượt
mình sẽ chọn một trong hai quân bài ngoài cùng (phải nhất hoặc trái nhất) và bốc quân bài đó lên. Trò
chơi kết thúc khi không còn quân bài nào trên bàn, người thắng cuộc là người có tổng các số ghi trên các
quân bài của mình lớn hơn.
Yêu cầu: Với thông tin về các quân bài ban đầu, Tí là người đi đầu, bạn hãy cho biết Tí có khả năng chắc
thắng hay không, nếu có hãy chỉ ra bước đi đầu tiên của Tí.
Dữ liệu vào: Tập tin BOCBAI.INP chứa số N là số quân bài trên bàn.
Dòng tiếp theo có N số ghi số trên quân bài
Kết quả: xuất ra tập tin BOCBAI.OUT gồm:
•
•
Nếu chắc thắng, dòng đầu tiên ghi số 1, nếu không chắc thắng dòng đầu tiên ghi số 0
Dòng thứ hai ghi vị trí bốc đầu tiên của quân bài (1 hoặc N)
Ví dụ:
Bocbai.INP
8
3 4 6 12 5 7 2 9
Bocbai .OUT
1
8
Bocbai .INP
7
3 4 6 12 5 7 8
Bocbai .OUT
0
Một số bài toán tham lam luyện thi học sinh giỏi
1. />2. />3. />4. />Giáo viên: Lê Thanh Phú
5|Tra n g
Tài liệu bồi dưỡng học sinh giỏi THPT – Môn Tin học
5. />6. />7. />8. />9. />10. />11. />12. />13. />14. />15. />16. />17. />18. />
Giáo viên: Lê Thanh Phú
6|Tra n g
Phần II: Chuyên đề nâng cao