Page 121 - C:\Users\Admin\Desktop\Sach mem upweb\
P. 121
100 Problems & Solutions Trang 121
Var i,j : integer ;
Begin
Clsscr;
for i:= 1 to do
begin
for j:= 1to 4 do write (4*(i-1) + j :3);
for j:= 0 to 4 do write (81-4*i-(i-1)+j :3) ;
Writeln;
end ;
Write (‘tong cac so o cot 5: ‘,(37+77)*9div2);
Readln
End.
(Lời giải của bạn Nguyễn Chí Thức - Lớp 11A1 - Khối PTCTT - ĐHSPHN - Thôn Đại
Đồng - xã Thuỵ Phương - Từ Liêm - Hà Nội)
Bài 67/2001 - Về các phép biến đổi "Nhân 2 trừ 1"
(Dành cho học sinh THCS và PTTH)
Để biến đổi ma trận A thành 0, ta biến đổi từng cột thành 0
Xét một cột bất kì có n số a1, ..., an (ai >= 0)
Đặt X = max(a1, ..., an).
- Bước 1:
+ Nếu dãy a1, ..., an có một số 0 và một số khác 0, dừng ở đây vì không thể đưa A về
0;
- Bước 2:
+ Nếu dãy a1, ..., an có ai = 0 (i = 1..n) thì cột này đã được biến đổi xong, qua cột tiếp
theo,
+ Nếu không thì ai = 2ai nếu 2ai <= X (nhân hàng có chứa số ai lên 2), tiếp tục thực
hiện đến khi không nhân được nữa, qua bước 3;
- Bước 3:
X:= X-1;
ai:= ai-1;
Quay lại bước 2.
Đây không phải là lời giải tốt ưu nhưng rất đơn giản, dễ dàng cài đặt (việc viết chương
trình tương đối đơn giản)
Nhận xét: Bài này thực sự dễ nếu chỉ dừng lại ở mức tìm thuật toán? Nếu đặt lại điều
kiện là có thể nhân hàng, cột cho 2, trừ hàng, cột cho 1, tìm lời giải tối ưu với giới hạn
của M, N thì hay hơn nhiều.
(Lời giải của bạn Vũ Lê An - Lớp 11T2 - Lê Khiết - Quảng Ngãi)
Thuật toán của bạn Vũ Lê An rất đúng. Song trên thực tế thuật toán này còn một điểm
chưa chuẩn vì nếu các số của mảng số thì nhỏ, số thì lớn thì thuật toán này mất rất nhiều
bước. Việc nhân có thể gây ra tràn số.
Ví dụ:
2 3
1 100 1
100 1 100
số bước sẽ rất lớn.
Nhưng thuật toán này trên lý thuyết là giải được. Chương trình theo thuật toán trên.
{$A+,B-,D+,E+,F-,G-,I+,L+,N-,O-,P-,Q+,R+,S+,T-,V+,X+,Y+}
{$M 16384,0,655360}
program bai67_bien_doi_mang; {Author : Nguyen Van Chung}
Tin học & Nhà trường 100 Đề Toán - Tin học