Bạn có thể cải tiến chương trình này bằng cách kiểm tra các điều kiện ngay trong quá trình duyệt để giảm bớt thời gian duyệt.. Cách làm khác dùng thuật toán chia kẹo chạy rất nhanh với N[r]
(1)Bài 74/2001 - Hai hàng số kỳ ảo (Dành cho học sinh THCS PTTH)
Tổng số từ đến 2n: + + … + 2n = (2n*(2n+1))/2 = n*(2n+1)
Do đó, để hai hàng có tổng tổng hàng phải là: (n*(2n+1))/2, n phải số chẵn tồn hai hàng số kì ảo
Tổng n cột nên tổng cột là: 2n+1
ứng với số A[i] (A[i] = 1, 2, …, 2n) tồn số B[i] = 2n -(A[i] -1) cho: A[i] + B[i] = 2n + 1;
Tồn chương trình lời giải: Program bai74;
uses crt; var n:byte;
a:array[1 100]of 1; th:array[0 50]of byte; ok:boolean;
s:integer; Procedure xet; var i,j,tong:integer; duoc:boolean; Begin
tong:=0;
for j:=1 to n tong:=tong+th[j]; if tong=s div then
begin
duoc:=true; for j:=1 to n-1 for i:=j+1 to n
if th[j]+th[i]=(s div n) then duoc:=false; if duoc then
begin
for i:=1 to n write(th[i]:3); writeln;
for i:=1 to n write(((s div n)-th[i]):3); ok:=true;
end; end; end;
Procedure try(i:byte); var j:byte;
Begin
if i>n then xet else if not ok then
for j:=th[i-1]+1 to 2*n begin
(2)end; End;
Procedure xuli; var i:byte; Begin th[0]:=0; ok:=false; s:=n*(2*n)+1; try(1);
if ok=false then write('Khong the sap xep'); End;
BEGIN clrscr;
write('Nhap n:');readln(n);
if n mod =1 then writeln('Khong the sap xep') else xuli;
readln; END
(Lời giải bạn Hoàng Phương Nhi - PTTH chuyên Lý Tự Trọng - Cần Thơ)
Nhận xét: Cách làm bạn Hoàng Phương Nhi - PTTH chuyên Lý Tự Trọng - Cần Thơ dùng thuật toán duyệt nên chạy khơng lớn Với N = 20 chương trình chạy lâu, N lớn khơng thể kết Bạn cải tiến chương trình cách kiểm tra điều kiện trình duyệt để giảm bớt thời gian duyệt
Cách làm khác dùng thuật toán chia kẹo chạy nhanh với N<35 Tổng số từ đến 2n: + + + 2n = (2n*(2n+1))/2 = n*(2n+1)
Do đó, để hai hàng có tổng tổng hàng phải là: (n*(2n+1))/2, n phải số chẵn tồn hai hàng số kì ảo
Tổng n cột nên tổng cột là: 2n+1
ứng với số A[i] (A[i] = 1, 2, , 2n) tồn số B[i] = 2n -(A[i] -1) cho: A[i] + B[i] = 2n +
{$A+,B-,D+,E+,F-,G-,I+,L+,N-,O-,P-,Q+,R+,S+,T-,V+,X+,Y+} {$M 16384,0,655360}
uses crt;
const max =35; fi = 'bai74.inp'; fo = 'bai74.out';
var d : array[0 max*(2*max+1) div 2] of byte; tr : array[1 max,0 max*(2*max+1) div 2]of byte; kq : array[1 max]of integer;
(3)procedure docf; var f :text; begin ok:=false; assign(f,fi); reset(f); read(f,n); close(f); end;
procedure lam; var i,j :integer; begin
sum:=n*(2*n+1) div 2; fillchar(d,sizeof(d),0); fillchar(tr,sizeof(tr),0); d[0]:=1;
for i:=1 to n begin
for j:=sum-i downto if d[j]=1 then
begin d[j+i]:=2; tr[i,j+i]:=1; end;
for j:=sum-(2*n+1-i) downto if d[j]=1 then
begin
d[j+2*n+1-i]:=2; tr[i,j+2*n+1-i]:=2; end;
for j:=0 to sum if d[j]>0 then dec(d[j]); end;
ok:=(d[sum]=1); end;
procedure ghif; var f :text; i,j :integer; begin
assign(f,fo); rewrite(f);
(4)begin
i:=sum;j:=n; while i>0 begin
if tr[j,i]=1 then kq[j]:=j else kq[j]:=2*n+1-j; i:=i-kq[j];
dec(j); end;
for j:=1 to n write(f,kq[j]:6); writeln(f);
for j:=1 to n write(f,(2*n+1-kq[j]):6); end;
close(f); end; BEGIN docf;
if n mod 2=0 then lam; ghif;