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.. Kết quả: ghi ra màn hình tổng và các cặp số.. - Dòng
Trang 1CHUYÊ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ụ:
2
1 3 4 2
- Tổng: 14
- Các cặp: (1,2); (3,4) 5
1 3 -4 2 0 1
- 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
Trang 2- 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ụ:
3 5
3 4 2
2 0
5 7
1 3 7 1 4
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 ai 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
4 4 4 4
output
10
input
Trang 32 1 4 3
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 PTichSO.OUT
Giới hạn: 1<=n<=1000000;
3.3 Nối xích: http://laptrinh.ntu.edu.vn/Problem/Details/4398
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ụ:
3
2 3 4
2
5
1 2 3 4 5
3
Giới hạn: 1<=n<=20000; 1<=a[i]<= 2000;
3.4 Sửa xe: Nguồn: http://vn.spoj.com/problems/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] (i=1 n).
Trang 4Ô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ụ:
4
1 3 4 2
3 2 3 1
44
4 2 3 1
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: http://vn.spoj.com/problems/BWPOINTS/
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ụ:
3
0 3 1 -3 5 -1
2
Trang 5Giới hạn:
1<=n<=10000; |a[i]|,|b[i]|<=1000000000;
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
5
0 2
1 2
3 4
2 5
4 5
2
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 ≤ 103) 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ụ:
Một số bài toán tham lam luyện thi học sinh giỏi
1. http://laptrinh.ntu.edu.vn/Problem/Details/2201
2. http://laptrinh.ntu.edu.vn/Problem/Details/4
3. http://laptrinh.ntu.edu.vn/Problem/Details/93
8
3 4 6 12 5 7 2 9 18
Bocbai INP Bocbai OUT
7
3 4 6 12 5 7 8 0
Trang 65. http://laptrinh.ntu.edu.vn/Problem/Details/134
6. http://vn.spoj.com/problems/NK2MFS/
7. http://vn.spoj.com/problems/NOIXICH/
8. http://vn.spoj.com/problems/CTNEWS/
9. http://vn.spoj.com/problems/CBUYING/
10. http://vn.spoj.com/problems/NUMCON/
11. http://vn.spoj.com/problems/BWPOINTS/
12. http://vn.spoj.com/problems/SBOOST/
13. http://vn.spoj.com/problems/CAR/
14. http://vn.spoj.com/problems/TWO/
15. http://vn.spoj.com/problems/MJOURNEY/
16. http://vn.spoj.com/problems/MCLEAN/
17. http://vn.spoj.com/problems/KSPREE/
18. http://vn.spoj.com/problems/MAJSTOR/