.12 Ghép hình chữ nhật

Một phần của tài liệu Sáng tạo trong thuật toán và lập trình Quyển 2 (Trang 35 - 37)

Cho N đoạn thẳng cùng chiều dài d đơn vị. Hãy chọn K đoạn để ghép thành cạnh của hình chữ nhật có diện tích lớn nhất.

Input: Hai số N và d, n  4. Output: Hiển thị trên màn hình - t: Tổng số đoạn cần chọn t, - a: Số đoạn đặt trên 1 chiều rộng - b: Số đoạn đặt trên 1 chiều dài, - s: Diện tích max.

Thí dụ,

Input: N = 23, d = 2.

Output: 22 5 6 120.

Thuật tốn

Định lý Trong các hình chữ nhật cùng chu vi thì hình vng có diện tích lớn nhất.

Chứng minh

Gọi c là chu vi của hình chữ nhật, a là chiều rộng, b là chiều dài, b  a, d là độ lệch giữa chiều dài b và chiều rộng a. Ta có, b = a + d và c = 2(a+a+d) = 4a + 2d, diện tích s = a(a+d). Thay giá trị a = (c2d)/4 vào biểu thức tính diện tích và rút gọn ta thu được s = c2

/16 – d2/4 = (c2 – 4d2)/16. Giá trị s đạt max khi và chỉ khi d = 0, tức là khi a = b. Vậy hình chữ nhật có diện tích lớn nhất là c2/16 chính là hình vng.

Từ định lý trên ta rút ra heuristics sau đây: muốn xây dựng một hình chữ nhật có diện tích lớn nhất từ một chu vi c cố định với các cạnh nguyên cho trước ta phải chọn độ lệch giữa chiều dài và chiều rộng nhỏ nhất có thể được.

Xét các trường hợp số đoạn còn thừa r = N mod 4. r = 0: bỏ qua

r = 1: bỏ qua

r = 2: thêm chiều dài 1 đoạn, b := b + 1; r = 3: thêm chiều dài 1 đoạn, b := b + 1;

Tổng quát: a = N div 4; b = a + (N mod 4) div 2; Khi đó diện tích sẽ là: s = a*b*d*d.

Thí dụ, N = 23, d = 2: a = 23 div 4 = 5; b = a + (N mod 4) div 2 = 5 + (3 div 2) = 5 + 1 = 6; t = 2*(a+b) = 2*(5+6) = 22; s = a*b*d*d = 5*6*2*2 = 120.

Độ phức tạp: O(1).

(* Pascal *)

(*======================================== Chon t trong n doan de ghep duoc HCN dien tich max

=======================================*) program GhepChuNhat;

uses crt;

const bl = #32;

procedure ChuNhatMax(n,d: longint); var a,b,t,s: longint;

begin

a := n div 4; b := a + ((n mod 4) div 2); t := 2 * (a + b); { tong so doan } s := a * b * d * d; writeln(t,bl,a,bl,b,bl,s); end; BEGIN ChuNhatMax(23,2); END. Kết quả dự kiến: 22 5 6 120 // C# using System; using System.IO; using System.Collections; namespace SangTao2 { class GhepHCN {

static void Main(string[] args){ ChuNhatMax(23,2);

Console.WriteLine("\n Fini "); Console.ReadLine();

}

static public void ChuNhatMax(int n, int d){ int a = n / 4; int b = a + ((n % 4) / 2); int t = 2 * (a + b); int s = a * b * d * d; Console.WriteLine(t + " " + a + " " + b + " " + s); } } // GhepHCN } // SangTao2

Một phần của tài liệu Sáng tạo trong thuật toán và lập trình Quyển 2 (Trang 35 - 37)

Tải bản đầy đủ (PDF)

(161 trang)