Sáng tạo trong thuật toán và lập trình với ngôn ngữ Pascal và C# Tập 1 - Chương 5
Số trang: 34
Loại file: pdf
Dung lượng: 984.65 KB
Lượt xem: 7
Lượt tải: 0
Xem trước 4 trang đầu tiên của tài liệu này:
Thông tin tài liệu:
PHƯƠNG PHÁP THAM LAM
Phương pháp tham lam gợi ý chúng ta tìm một trật tự hợp lí để duyệt dữ liệu nhằm đạt được mục tiêu một cách chắc chắn và nhanh chóng. Thông thường, dữ liệu được duyệt theo một trong hai trật tự là tăng hoặc giảm dần theo một chỉ tiêu nào đó. Một số bài toán đòi hỏi những dạng thức cải biên của hai dạng nói trên.
Nội dung trích xuất từ tài liệu:
Sáng tạo trong thuật toán và lập trình với ngôn ngữ Pascal và C# Tập 1 - Chương 5 129 Sáng tạo trong Thuật toán và Lập trình Tập I } static void IdQSort(int d, int c) { int i = d; int j = c; int m = id[(i + j) / 2]; int t = 0; while (i 130 Sáng tạo trong Thuật toán và Lập trình Tập I Phương pháp tham lam gợi ý chúng ta tìm một trật tự hợp lí để duyệt dữ liệu nhằm đạt được mục tiêu một cách chắc chắn và nhanh chóng. Thông thường, dữ liệu được duyệt theo một trong hai trật tự là tăng hoặc giảm dần theo một chỉ tiêu nào đó. Một số bài toán đòi hỏi những dạng thức cải biên của hai dạng nói trên. Bài 5.1. Băng nhạc Người ta cần ghi N bài hát, được mã số từ 1 đến N, vào một bă ng nhạc có thời lượng tính theo phút đủ chứa toàn bộ các bài đã cho. Với mỗi bài hát ta biết thời lượng phát của bài đó. Băng sẽ được lắp vào một máy phát nhạc đặt trong một siêu thị. Khách hàng muốn nghe bài hát nào chỉ việc nhấn phím ứng với bài đó. Để tìm và phát bài thứ i trên băng, máy xuất phát từ đầu cuộn băng, quay băng để bỏ qua i – 1 bài ghi trước bài đó. Thời gian quay băng bỏ qua mỗi bài và thời gian phát bài đó được tính là như nhau. Tính trung bình, các bài hát trong một ngày được khách hàng l ựa chọn với số lần (tần suất) như nhau. Hãy tìm cách ghi các bài trên băng sao cho tổng thời gian quay băng trong mỗi ngày là ít nhất. Dữ liệu vào được ghi trong tệp văn bản tên BANGNHAC.INP. Dòng đầu tiên là số tự nhiên N cho biết số lượng bài hát. - Tiếp đến là N số nguyên dương thể hiện dung lượng tính theo phút của - mỗi bài. Mỗi đơn vị dữ liệu cách nhau qua dấu cách. BANGNHAC.INP BANGNHAC.OUT Thí dụ dưới đây cho biết có N = 3 bài hát: 3 22 - Bài 1 phát trong thời gian 7 phút. 723 35 - Bài 2 phát trong thời gian 2 phút. 1 12 - Bài 3 phát trong thời gian 3 phút. 19 Dữ liệu ra được ghi trong tệp văn bản BANGNHAC.OUT theo dạng thức sau: - N dòng đầu tiên thể hiện trật tự ghi bài hát trên băng: m ỗi dòng gồm hai số nguyên dương j và d cách nhau bởi dấu cách, trong đó j là mã số của bài hát cần ghi, d là thời gian tìm và phát bài đó theo trật tự ghi này. - Dòng thứ n + 1 ghi tổng số thời gian quay băng nếu mỗi bài hát được phát một lần trong ngày. Với thí dụ trên, kết quả thu được sẽ như sau: - Cần ghi lần lượt trên băng các bài theo trật tự : bài 2, bài 3, bài 1; - Để tìm và phát bài 2 cần 2 phút; - Để tìm và phát bài 3 cần 5 phút; - Để tìm và phát bài 1 cần 12 phút; - Tổng thời gian để tìm và phát mỗi bài một lần là: 19 phút. Thuật toán Giả sử ta có ba bài hát với số phút lần lượt như sau: Mã số bài hát Thời gian phát 7 2 3 Ta xét vài tình huống ghi băng để rút ra kết luận cần thiết. 131 Sáng tạo trong Thuật toán và Lập trình Tập I Trật tự ghi trên băng Thời gian phát t(x) + t(y) + t(z); t(i): thời gian tìm và phát bài i (x, y, z) ( , , ) (7) + (7 + 2) + (7 + 2 + 3) = 28 phút ( , , ) (7) + (7 + 3) + (7 + 3 + 2) = 29 phút ( , , ) (2) + (2 + 7) + (2 + 7 + 3) = 23 phút (2) + (2 + 3) + (2 + 3 + 7) = 19 phút (phương án tối ưu) ( , , ) ( , , ) (3) + (3 + 7) + (3 + 7 + 2) = 25 phút ( , , ) (3) + (3 + 2) + (3 + 2 + 7) = 20 phút Vậy phương án tối ưu sẽ là ( , , ): ghi bài 2 rồi đến bài 3, cuối cùng ghi bài 1. Tổng thời gian theo phương án này là 19 phút. Để có phương án tối ưu ta chỉ cần ghi băng theo trật tự tăng dần của thời lượng. Bài toán được cho với giả thiết băng đủ lớn để ghi được toàn bộ các bài. Dễ dàng sửa chương trình để vận dụng cho trường hợp dung lượng tăng hạn chế trong M phút. Chương trình sắp xếp dữ liệu theo chỉ dẫn. (* Pascal *) (*---------------------- BangNhac.pas -----------------------*) program BangNhac; uses crt; const MN = 200; BL = #32; {dau cach} fn = 'Bangnhac.inp'; gn = 'Bangnhac.out'; var a,id: array[1..MN] of integer; f, g: text; n: integer; {------------------------------------ Doc du lieu tu input file vao mang a -------------------------------------} procedure Doc; var i,k: integer; begin assign(f,fn); reset(f); read(f,n); for i := 1 to n do read(f,a[i]); close(f); end; {--------------------------------- Khoi tri mang chi dan id quan li sap tang theo chi dan ----------------------------------} procedure InitID; var i: integer; begin for i := 1 to n do id[i] := i; end; {------------------------------- ...
Nội dung trích xuất từ tài liệu:
Sáng tạo trong thuật toán và lập trình với ngôn ngữ Pascal và C# Tập 1 - Chương 5 129 Sáng tạo trong Thuật toán và Lập trình Tập I } static void IdQSort(int d, int c) { int i = d; int j = c; int m = id[(i + j) / 2]; int t = 0; while (i 130 Sáng tạo trong Thuật toán và Lập trình Tập I Phương pháp tham lam gợi ý chúng ta tìm một trật tự hợp lí để duyệt dữ liệu nhằm đạt được mục tiêu một cách chắc chắn và nhanh chóng. Thông thường, dữ liệu được duyệt theo một trong hai trật tự là tăng hoặc giảm dần theo một chỉ tiêu nào đó. Một số bài toán đòi hỏi những dạng thức cải biên của hai dạng nói trên. Bài 5.1. Băng nhạc Người ta cần ghi N bài hát, được mã số từ 1 đến N, vào một bă ng nhạc có thời lượng tính theo phút đủ chứa toàn bộ các bài đã cho. Với mỗi bài hát ta biết thời lượng phát của bài đó. Băng sẽ được lắp vào một máy phát nhạc đặt trong một siêu thị. Khách hàng muốn nghe bài hát nào chỉ việc nhấn phím ứng với bài đó. Để tìm và phát bài thứ i trên băng, máy xuất phát từ đầu cuộn băng, quay băng để bỏ qua i – 1 bài ghi trước bài đó. Thời gian quay băng bỏ qua mỗi bài và thời gian phát bài đó được tính là như nhau. Tính trung bình, các bài hát trong một ngày được khách hàng l ựa chọn với số lần (tần suất) như nhau. Hãy tìm cách ghi các bài trên băng sao cho tổng thời gian quay băng trong mỗi ngày là ít nhất. Dữ liệu vào được ghi trong tệp văn bản tên BANGNHAC.INP. Dòng đầu tiên là số tự nhiên N cho biết số lượng bài hát. - Tiếp đến là N số nguyên dương thể hiện dung lượng tính theo phút của - mỗi bài. Mỗi đơn vị dữ liệu cách nhau qua dấu cách. BANGNHAC.INP BANGNHAC.OUT Thí dụ dưới đây cho biết có N = 3 bài hát: 3 22 - Bài 1 phát trong thời gian 7 phút. 723 35 - Bài 2 phát trong thời gian 2 phút. 1 12 - Bài 3 phát trong thời gian 3 phút. 19 Dữ liệu ra được ghi trong tệp văn bản BANGNHAC.OUT theo dạng thức sau: - N dòng đầu tiên thể hiện trật tự ghi bài hát trên băng: m ỗi dòng gồm hai số nguyên dương j và d cách nhau bởi dấu cách, trong đó j là mã số của bài hát cần ghi, d là thời gian tìm và phát bài đó theo trật tự ghi này. - Dòng thứ n + 1 ghi tổng số thời gian quay băng nếu mỗi bài hát được phát một lần trong ngày. Với thí dụ trên, kết quả thu được sẽ như sau: - Cần ghi lần lượt trên băng các bài theo trật tự : bài 2, bài 3, bài 1; - Để tìm và phát bài 2 cần 2 phút; - Để tìm và phát bài 3 cần 5 phút; - Để tìm và phát bài 1 cần 12 phút; - Tổng thời gian để tìm và phát mỗi bài một lần là: 19 phút. Thuật toán Giả sử ta có ba bài hát với số phút lần lượt như sau: Mã số bài hát Thời gian phát 7 2 3 Ta xét vài tình huống ghi băng để rút ra kết luận cần thiết. 131 Sáng tạo trong Thuật toán và Lập trình Tập I Trật tự ghi trên băng Thời gian phát t(x) + t(y) + t(z); t(i): thời gian tìm và phát bài i (x, y, z) ( , , ) (7) + (7 + 2) + (7 + 2 + 3) = 28 phút ( , , ) (7) + (7 + 3) + (7 + 3 + 2) = 29 phút ( , , ) (2) + (2 + 7) + (2 + 7 + 3) = 23 phút (2) + (2 + 3) + (2 + 3 + 7) = 19 phút (phương án tối ưu) ( , , ) ( , , ) (3) + (3 + 7) + (3 + 7 + 2) = 25 phút ( , , ) (3) + (3 + 2) + (3 + 2 + 7) = 20 phút Vậy phương án tối ưu sẽ là ( , , ): ghi bài 2 rồi đến bài 3, cuối cùng ghi bài 1. Tổng thời gian theo phương án này là 19 phút. Để có phương án tối ưu ta chỉ cần ghi băng theo trật tự tăng dần của thời lượng. Bài toán được cho với giả thiết băng đủ lớn để ghi được toàn bộ các bài. Dễ dàng sửa chương trình để vận dụng cho trường hợp dung lượng tăng hạn chế trong M phút. Chương trình sắp xếp dữ liệu theo chỉ dẫn. (* Pascal *) (*---------------------- BangNhac.pas -----------------------*) program BangNhac; uses crt; const MN = 200; BL = #32; {dau cach} fn = 'Bangnhac.inp'; gn = 'Bangnhac.out'; var a,id: array[1..MN] of integer; f, g: text; n: integer; {------------------------------------ Doc du lieu tu input file vao mang a -------------------------------------} procedure Doc; var i,k: integer; begin assign(f,fn); reset(f); read(f,n); for i := 1 to n do read(f,a[i]); close(f); end; {--------------------------------- Khoi tri mang chi dan id quan li sap tang theo chi dan ----------------------------------} procedure InitID; var i: integer; begin for i := 1 to n do id[i] := i; end; {------------------------------- ...
Tìm kiếm theo từ khóa liên quan:
ngôn ngữ Pascal lập trình C# giải bài toán tin giáo trình lập trình thuật toán máy tínhGợi ý tài liệu liên quan:
-
Thiết kế mạch logic bằng Verilog - HDL
45 trang 164 0 0 -
142 trang 130 0 0
-
150 trang 104 0 0
-
33 trang 70 0 0
-
Ngân hàng đề thi học phần Nhập môn tin học - Nhập môn lập trình
18 trang 44 0 0 -
thủ thuật windows XP hay nhất phần 2
14 trang 42 0 0 -
Giáo trình môn ngôn ngữ lập trình C
284 trang 38 0 0 -
Một số giải pháp lập trình ASP.NET 2.0
82 trang 37 0 0 -
10 trang 31 0 0
-
Giáo trình: Lập trình hướng đối tượng
98 trang 29 0 0 -
hướng dẫn sử dụng Rhino Ceros phần 6
12 trang 29 0 0 -
Giáo trình: Java và công nghệ J2ME
96 trang 29 0 0 -
accounting reference desktop 2002 phần 6
64 trang 28 0 0 -
ALGORITHMIC INFORMATION THEORY - CHAPTER 4
31 trang 27 0 0 -
Hướng dẫn sử dụng ESOFT FINANCIALS
150 trang 27 0 0 -
Tập bài giảng Lập trình cơ bản
208 trang 27 0 0 -
thủ thuật windows XP hay nhất phần 1
14 trang 26 0 0 -
285 trang 26 0 0
-
Bài tập lớn kỹ thuật lập trình ĐHBKHN
9 trang 25 0 0 -
giáo trình visual basic và pic phần 2
13 trang 25 0 0