Thứ Hai, 16 tháng 12, 2013

Ghép hình chữ nhật



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 toán

Định lý Trong các hình chữ nhật cùng chu vi thì hình vuông 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 vuông.
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.
Khởi trị: a = b = N div 4.
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


Nguồn:

SÁNG TẠO
TRONG THUẬT TOÁN
LẬP TRÌNH


Không có nhận xét nào:

Đăng nhận xét