Bài 35/2000 - Các phân số được sắp xếp
(Dành cho học sinh THPT)
Program bai35;
Uses crt;
Type Phanso = (tu, mau);
Var F: array[1..4000, phanso] of integer;
N, dem : Integer;
Procedure nhap;
Begin
Write('Nhap so N:'); Readln(N);
F[1,tu] := 0; F[1,mau] := 1; dem := 2;
F[dem, tu] := 1; F[dem,mau] := 1;
End;
Procedure Chen(t,m,i:Integer);
Var j:integer;
Begin
Inc(dem);
For j := dem downto i + 1 do
begin
F[j,tu] := F[j-1,tu];
F[j,mau] := F[j-1,mau];
end;
F[i,tu] := t; F[i,mau] := m;
End;
Program xuli;
Var t,m,i:integer;
Begin
for m:=2 to N do
for t:=1 to m-1 do
begin
i:=1;
While (F[i,tu]*m < F[i,mau]*t) do inc(i);
If (F[i,tu]*m > F[i,mau]*t) then chen(t,m,i);
end;
End;
Procedure xuat;
var i:integer;
Begin
for i:=2 to dem do
begin
If WhereX > 75 then writeln;
If WhereY > 24 then
begin
Write('Nhan Enter de tiep tuc');
Readln;
end;
write('Tat ca co', dem,' phan so.');
Readln;
End;
BEGIN
nhap;
xuli; Xuat; END. Bài 36/2000 - Anh chàng hà tiện
(Dành cho học sinh Tiểu học)
Liệt kê số tiền phải trả cho từng chiếc cúc rồi cộng lại, ta được bảng sau:
-
Thứ tự
|
Số tiền
|
Cộng dồn
|
1
|
1
|
1
|
2
|
2
|
3
|
3
|
4
|
7
|
4
|
8
|
15
|
5
|
16
|
31
|
6
|
32
|
63
|
7
|
64
|
127
|
8
|
128
|
255
|
9
|
256
|
511
|
10
|
512
|
1023
|
11
|
1024
|
2047
|
12
|
2048
|
4095
|
13
|
4096
|
8191
|
14
|
8192
|
16383
|
15
|
16384
|
32767
|
16
|
32768
|
65535
|
17
|
65536
|
131071
|
18
|
131072
|
262143 (= 218 -1)
|
Như vậy anh ta phải trả 262143 đồng và anh ta rõ ràng là bị "hố" nặng do phải trả gấp hơn 20 lần so với cách thứ nhất.
Bài 37/2000 - Số siêu nguyên tố
(Dành cho học sinh THCS)
Program Bai37;
{SuperPrime};
var a,b: array [1..100] of longint;
N,i,k,ka,kb,cs: byte;
Function Prime(N: longint): boolean;
Var i: longint;
Begin
If (N=0) or (N=1) then
Prime:=false
Else
Begin
i:=2;
While (N mod i <> 0) and (i <= Sqrt(N)) do Inc(i);
If i > Sqrt(N) then
Prime:=true Else Prime:=false;
End;
End;
BEGIN
Write ('Nhap N: ');
Readln (N);
ka:=1; a[ka]:=0;
For i:=1 to N do
Begin
Kb:=0;
For k:=1 to ka do
For cs:=0 to 9 do
If Prime(a[k]*10+cs) then
Begin
Inc(kb);
b[kb]:=a[k]*10+cs;
end;
ka:=kb;
For k:=1 to ka do
a[k]:=b[k]; end;
For k:=1 to ka do
Write(a[k]:10);
Writeln;
Writeln('Co tat ca',ka,'so sieu nguyen to co',N,'chu so.');
Readln;
END.
Bài 38/2000 - Tam giác số
Uses Crt;
Const inp='INPUT.TXT';
Var N,Smax: integer;
a: array [1..100,1..100] of integer;
{----------------------------------------}
Procedure Nhap;
Var f: text;
i,j: integer;
Begin
Assign(f,inp);
Reset(f);
Readln(f,n);
For i:=1 to N do
begin
For j:=1 to i do Read(f,a[i,j]);
Readln(f);
end;
Close(f);
End;
{----------------------------------------}
Procedure Thu(S,i,j: integer);
Var k,S_new: integer;
Begin
S_new:=S+a[i,j];
If i=N then
begin
If S_new>Smax then Smax:=S_new;
end
else
For k:=j to j+1 do Thu(S_new, i+1, k);
End;
{----------------------------------------}
BEGIN
Nhap;
Smax:=0;
Thu(0,1,1);
Write('Smax = ',Smax);
Readln;
END.
Dưới đây các bạn có thể tham khảo lời giải của bạn Phạm Đức Thanh dùng phương pháp quy hoạch động trên mảng hai chiều:
Program bai38;
Uses crt;
Type mang = array[1..100,1..100] of integer;
Var
f:text;
i,j,n:integer;
a,b:mang;
Procedure Input;
Begin
clrscr;
Assign(f,'input.txt');
reset(f);
readln(f,n);
for j:=1 to n do
begin
for i:=2 to j+1 do
read(f,a[j,i]);
end;
close(f);
end;
{----------------------------------}
Function Max(m,n:integer):integer;
Begin
if n>m then Max:=n
else Max:=m;
end;
{----------------------------------}
Procedure MakeArrayOfQHD;
Begin
b[1,2]:=a[1,2];
for j:=1 to n do b[j,1]:=-maxint;
for i:=3 to n do b[1,i]:=-maxint;
for j:=2 to n do
begin
for i:=2 to j+1 do
b[j,i]:=a[j,i]+max(b[j-1,i],b[j-1,i-1]);
end;
end;
{-----------------------------------}
Procedure FindMax;
var max:integer;
Begin
max:=b[n,1];
for i:=2 to n do
if b[n,i]>max then max:=b[n,i];
writeln('Smax:=',max);
readln;
end;
{------------------------------------}
BEGIN
Input;
makearrayofQHD;
FindMax;
END.
Nhận xét: Lời giải dùng thuật toán quy hoạch động của Phạm Đức Thanh tốt hơn rất nhiều so với thuật toán đệ quy quay lui.
Bài 39/2000 - Ô chữ
{$A+,B-,D+,E+,F-,G-,I+,L+,N-,O-,P-,Q+,R+,S-,T-,V+,X+}
{$M 16384,0,655360}
uses crt;
const fi = 'input.txt';
fo = 'output.txt';
var A : array[1..5,1..5] of char;
new,blank : record x,y : integer end;
procedure no_no_and_no;
var f : text;
begin
assign(f,fo);
rewrite(f);
write(f,'This puzzle has no final configuration.');
close(f);
halt;
end;
procedure yes_yes_and_yes;
var f : text;
i,j : byte;
begin
assign(f,fo);
rewrite(f);
for i := 1 to 5 do
begin
for j :=1 to 5 do
write(f,a[i,j]);
writeln(f);
end;
close(f);
end;
procedure swap(px,py : integer);
var coc : char;
begin
new.x := blank.x + px;
new.y := blank.y + py;
if (new.x >5) or (new.y >5) or (new.x <1) or (new.y <1) then
no_no_and_no;
coc := A[new.x,new.y];
A[new.x,new.y] := A[blank.x,blank.y];
A[blank.x,blank.y] :=coc;
blank := new;
end;
procedure chuyen(ch : char);
begin
case ch of
'A' : swap( -1,0);
'B' : swap( 1,0);
'R' : swap( 0, 1);
'L' : swap( 0,-1);
end;
end;
procedure docf;
var f : text;
i,j : byte;
s : string[5];
ch : char;
begin
assign(f,fi);
reset(f);
for i :=1 to 5 do
begin
readln(f,s);
if length(s) = 4 then s := s+ #32;
for j := 1 to 5 do
begin
A[i,j] := s[j];
if A[i,j] = #32 then
begin
blank.x := i;
blank.y := j;
end;
end;
end;
while not seekeof(f) do
begin
read(f,ch);
if ch = '0' then exit;
chuyen(ch);
end;
close(f);
end;
BEGIN
clrscr;
docf;
yes_yes_and_yes;
END.
Bài 40/2000 - Máy định vị Radio
Uses crt;
Const nmax = 30;
Output = 'P27.out';
Input = 'P27.inp';
Type
str20 = string[20];
Var
Toado : Array[1..nmax,1..2] of real;
TenDen,TenDen1,TenDen2 : Array[1..nmax] of str20;
n,j,i,k:integer;
Td1,Td2:array[1..2] of integer;
goc,g1,g2,v,l:array[1..2] of real;
t1,t2:array[1..2] of integer;
xd,yd,x,y, x1,x2,y1,y2:array[1..2] of real;
f:text;
Function tg(x: real): real;
Begin
if cos(x)<>0 then tg:=sin(x)/cos(x);
End;
Procedure DocDen(var s:str20);
Var d:char;
Begin
repeat
read(f,d);
Until (d<>' ');
s:='';
While (d<>' ') do
begin
s:=s+d;
Read(f,d);
End;
End;
Function XdToado(s:str20):Integer;
Var i:integer;
Begin
i:=1;
While (i<=n) and (s<> tenden[i]) do inc(i);
XdToado:=i;
End;
Procedure InputDen;
Var i:integer;
Begin
Assign(f,input);
Reset(f);
Readln(f,n);
For i:=1 to n do
Begin
DocDen(TenDen[i]);
Readln(f,Toado[i,1],Toado[i,2]);
End;
End;
Procedure Inputkichban;
Begin
Readln(f,k);
For i:=1 to k do
Begin
Readln(f, goc[i],v[i]);
Read(f,t1[i]);
Docden(tenden1[i]);
Td1[i]:=Xdtoado(tenden1[i]);
Readln(f,g1[i]);
Read(f,t2[i]);
Docden(tenden2[i]);
Td2[i]:=Xdtoado(tenden2[i]);
Readln(f,g2[i]);
End;
Close(f);
End;
Procedure Doi;
Begin
For j:=1 to k do
Begin
goc[j]:=goc[j]*pi/180;
g1[j]:=g1[j]*pi/180;
g2[j]:=g2[j]*pi/180;
l[j]:=(t2[j]-t1[j])*v[j];
End;
End;
Procedure TinhToan;
Begin
Assign(f,output);Rewrite(f);
For j:=1 to k do
Begin
x1[j]:=Toado[td1[j],1];
y1[j]:=Toado[td1[j],2];
x2[j]:=Toado[td2[j],1];
y2[j]:=Toado[td2[j],2];
xd[j]:=x1[j]+l[j]*sin(goc[j]);
yd[j]:=y1[j]+l[j]*cos(goc[j]);
If (cos(goc[j]+g2[j])=0) or (cos(goc[j]+g1[j])=0) then
Writeln(f,'Scenario ',j,': Position cannot be determined')
else
Begin
y[j]:= (xd[j] - x2[j] - yd[j]*tg(goc[j] + g1[j]) + y2[j]*tg(goc[j] + g2[j]))/(tg(goc[j] + g2[j]) - tg(goc[j] + g1[j]));
x[j]:= x2[j] - (y2[j] - y[j])*tg(goc[j] + g2[j]);
Writeln(f,'Scenario ',j,': Positino is (', x[j]:6:2, y[j]:6:2,')') ;
end;
End;
End;
BEGIN
InputDen;
Inputkichban;
Doi;
TinhToan;
Close(f);
END.
Bài 41/2000 - Cờ Othello
Program bai41; {Co Othello}
Uses Crt ;
Const Inp = 'othello.Inp' ;
Out = 'othello.out' ;
nmax = 50;
huongi:array[1..8] of integer = (-1,-1,-1,0,0,1,1,1);
huongj:array[1..8] of integer = (-1,0,1,-1,1,-1,0,1);
Type
Mang1 = Array [1..nmax] of string[3] ;
Mang2 = Array [1..8,1..8] of char ;
Var f: text;
a: mang2; l:mang1;
c: char; n, k, code:integer;
di:array[1..8,1..8] of boolean;
x0,y0:array[1..nmax] of integer;
{=================================================}
Procedure nhap;
Var i,j : Byte ;
Begin
Assign(f,inp) ;
Reset(f) ;
for i:=1 to 8 do
begin
for j:=1 to 8 do Read(f,a[i,j]) ;
Readln(f) ;
end;
Readln(f,c) ;
i:=0;
while not eof(f) do
begin
inc(i);
Readln(f,l[i]);
end;
n:=i;
End ;
{===============================================}
Procedure kiemtra(i,j:integer);
Var m:integer;
Begin
Case c of
'B': If a[i,j] = 'B' then
Begin
m:= 1;
repeat
if (a[i+huongi[m],j+huongj[m]] = 'W')
and(i+huongi[m]>0)and(j+huongj[m]>0)
and(i+2*huongi[m]>0)and(j+2*huongj[m]>0)
and(i+huongi[m]<9)and(j+huongj[m]<9)
and(i+2*huongi[m]<9)and(j+2*huongj[m]<9)
and(A [i+2*huongi[m],j+2*huongj[m]] = '-')
then
di [i+2*huongi[m],j+2*huongj[m]] := True;
m:=m+1;
until m>8;
End;
'W': If (a[i,j] = 'W') then
Begin
m:= 1;
repeat
if (a [i+huongi[m],j+huongj[m]] = 'B')
and(i+huongi[m]>0)and(j+huongj[m]>0)
and(i+2*huongi[m]>0)and(j+2*huongj[m]>0)
and(i+huongi[m]<9)and(j+huongj[m]<9)
and(i+2*huongi[m]<9)and(j+2*huongj[m]<9)
and(a[i+2*huongi[m],j+2*huongj[m]] = '-')
then
di[i+2*huongi[m],j+2*huongj[m]] := True;
m:=m+1;
until m>8;
end;
End;{of Case}
End;
{================================================}
Procedure lietke;
Var
i,j,m: Integer;
t: Boolean;
Begin
t:= false;
for i:=1 to 8 do
for j:= 1 to 8 do
di[i,j]:=false;
for i:=1 to 8 do
for j:= 1 to 8 do kiemtra(i,j);
for i:= 1 to 8 do
for j:= 1 to 8 do
If di[i,j] then
Begin
t:= True;
Write (f,'(',i,',',j,')');
End;
If t=false then Write (f, 'No legal move.');
Writeln(f);
End;
{======================================}
Procedure latco(x0,y0:integer);
Var m:integer;
Begin
Case c of
'B': if a[x0,y0] ='-'then
begin
m:= 1;
repeat
If (a[x0-2*huongi[m],y0-2*huongj[m]] = 'B')
and(a[x0-huongi[m],y0-huongj[m]] = 'W')
then
begin
a[x0,y0]:='B';
a[x0-huongi[m],y0-huongj[m]] := 'B';
end;
m:=m+1;
until m>8;
end;
'W': if a[x0,y0] ='-'then
begin
m:= 1;
repeat
If (a[x0-2*huongi[m],y0-2*huongj[m]] = 'W')
and(a[x0-huongi[m],y0-huongj[m]] = 'B')
then
begin
a[x0,y0]:='W';
a[x0-huongi[m],y0-huongj[m]] := 'W';
end;
m:=m+1;
until m>8;
end;
end;
End;
{=============================================}
Procedure Thuchien(k:integer);
Var
i,j,xx,yy,xx1,yy1: Integer;
code,m: Integer;
Begin
for i:= 1 to 8 do
for j:= 1 to 8 do
begin
if a[i,j]='W'then yy1:=yy1+1;
if a[i,j]='B'then xx1:=xx1+1;
end;
xx:= 0; yy:= 0;
for i:= 1 to 8 do
for j:= 1 to 8 do kiemtra(i,j);
If not di[x0[k],y0[k]] then
begin
Case c Of
'W':c:= 'B';
'B':c:= 'W';
End;
for i:= 1 to 8 do
for j:= 1 to 8 do kiemtra(i,j);
If not di[x0[k],y0[k]] then
Case c Of
'W':c:= 'W';
'B':c:= 'B';
End;
end;
latco(x0[k],y0[k]);
for i:= 1 to 8 do
for j:= 1 to 8 do
begin
if a[i,j]='W'then yy:=yy+1;
if a[i,j]='B'then xx:=xx+1;
end;
WriteLn (f,'Black - ',xx, ' White - ',yy );
if (xx<>xx1)and(yy<>yy1) then
Case c Of
'W':c:= 'B';
'B':c:= 'W';
End;
End;
{=============================================}
Procedure ketthuc;
Var
i,j:Integer;
Begin
for i:= 1 to 8 do
begin
for j:= 1 to 8 do Write (f,a [i,j]);
Writeln(f);
end;
End;
{==========================================}
Begin
clrscr;
nhap;
Assign(f,out);
Rewrite(f);
for k:=1 to n do
Case l[k][1] of
'L': Lietke;
'M':begin
Val(l[k][2],x0[k],code);
Val(l[k][3],y0[k],code);
Thuchien(k);
end;
'Q': ketthuc;
End;
Close(f);
End.
Bài 42/2000 - Một chút về tư duy số học
(Dành cho học sinh Tiểu học)
Giả sử A là số phải tìm, khi đó A phải có dạng:
A = 2k1 + 1 = 3k2 +2 = ... = 10k9 + 9 (k1, k2, ..., k9 - là các số tự nhiên).
Khi đó A + 1 = 2(k1 + 1) = 3(k2 +1 ) = ... = 10(k9+ 1).
Vậy A+1 phải là BSCNN (bội số chung nhỏ nhất) của (2, 3, ..., 10) = 2520.
Do đó số phải tìm là A = 2519.
Bài 43/2000 - Kim giờ và kim phút gặp nhau bao nhiêu lần trong ngày
(Dành cho học sinh Tiểu học)
Ta có các nhận xét sau:
+ Kim phút chạy nhanh gấp 12 lần kim giờ. Giả sử gọi v là vận tốc chạy của kim giờ, khi đó vận tốc của kim phút là 12v.
+ Mỗi giờ kim phút chạy một vòng và gặp kim giờ một lần. Như vậy trong 24 giờ, kim giờ và kim phút sẽ gặp nhau 24 lần. Tất nhiên những lần gặp nhau trong 12 giờ đầu cũng như các lần gặp nhau trong 12 giờ sau. Và các lần gặp nhau lúc 0 giờ, 12 giờ và 24 giờ là trùng nhau và gặp nhau vào chính xác các giờ đó.
Do đó, ở đây ta chỉ xét trong chu kì một vòng của kim giờ (tức là từ 0 giờ đến 12 giờ).
Giả sử kim giờ và kim phút gặp nhau lúc h giờ (h = 0, 1, 2, 3, ..., 10, 11) và s phút. Và giả sử xét quãng đường được đo theo đơn vị là phút. Do thời gian chạy là như nhau nên ta có:
60h = 11s s = .
Thay lần lượt h = 0, 1, 2, 3, ..., 10, 11 vào ta sẽ tính được s.
Ví dụ:
Với h = 0, s = 0 Kim giờ và kim phút gặp nhau đúng vào lúc 0 giờ.
h = 1, s = = Kim giờ và kim phút gặp nhau lúc 1 giờ phút.
h = 2, s = Kim giờ và kim phút gặp nhau lúc 2 giờ phút.
....
h = 11, s = 60; 11 giờ 60 phút = 12 giờ Kim giờ và kim phút gặp nhau đúng vào lúc 12 giờ.
Bài 44/2000 - Tạo ma trận số
(Dành cho học sinh THCS)
Program mang;
uses crt;
const n=9;
var a:array[1..n,1..n] of integer;
i,j,k:integer; t:boolean;
Begin
clrscr;
for j:=1 to n do
Begin
a[1,j]:=j;
a[j,1]:=a[1,j];
end;
i:=1;
repeat
i:=i+1;
for j:=i to n do
begin
t:= false;
for k:= 2 to j-1 do if (a[k-1,i]>a[k,i]) then t:=true;
if t then
begin
if a[j-1,i]+2 > n*2 then a[j,i]:=2 else a[j,i]:=a[j-1,i]+2;
a[i,j]:=a[j,i];
end
else
begin
if a[j-1,i]+i>2*n then a[j,i]:=2 else a[j,i]:=a[j-1,i]+i;
a[i,j]:=a[j,i];
end;
end;
until i=n;
for i:=1 to n do
begin
for j:=1 to n do write(a[i,j]:4);
writeln;
end;
readln;
end.
Bài 45/2000 - Các vòng tròn Olympic
(Dành cho học sinh THCS và PTTH)
{$Q-}
{$M 65000 0 655360}
Program Vong_Tron;
Uses Crt,Dos;
Const Max = 39;
Fileout = 'VTron.out';
Dvt : array [1 .. 5,0 .. 8] of byte = ((8,1,2,3 ,4 ,5 ,6 ,7,8),
(6,2,3,4 ,9 ,10,11,0,0),
(6,4,5,6 ,11,12,13,0,0),
(4,6,7,13,14,0 ,0 ,0,0),
(4,1,2,9 ,15,0 ,0 ,0,0));
D0 : array [1 .. 5] of byte = (8,11,13,14,15);
Type Limt = 0 .. Max;
Mang = array [Limt] of byte;
Var A,B : Mang;
dm : longint;
fout : text;
{-------------------------------------}
Procedure Time;
Var h,k,i,j : word;
Begin
Gettime(h,k,i,j);
writeln(h,' : ',k,' : ',i,'.',j);
End;
{-------------------------------------}
Procedure Output;
Var i,j : byte;
Begin
Inc(dm);
For i := 1 to 15 do write(fout,A[i],' ');
writeln(fout);
End;
{-------------------------------------}
Function GT(j0,count : shortint) : byte;
Var s,i0 : shortint;
Begin
s := 0;
For i0 := 1 to Dvt[j0,0] do
if Dvt[j0,i0] <= count then Inc(s,A[Dvt[j0,i0]]);
GT := s;
End;
{-------------------------------------}
Procedure Try(s0,count,k0 : shortint);
Var i0 : shortint;
Begin
if (count <= D0[k0]) and (s0 <= Max) then
For i0 := 1 to Max-s0 do if B[i0] = 0 then
Begin
B[i0] := 1;
A[count] := i0;
if (count = D0[k0]) and (s0 + i0 = Max) then
Begin
if k0 = 5 then Output else Try(gt(k0 + 1,count),count + 1,k0 + 1);
End else Try(s0 + i0,count + 1,k0);
B[i0] := 0;
End;
End;
{-------------------------------------}
Procedure Process;
Begin
clrscr;
Time;
Assign(fout,fileout);rewrite(fout);
Fillchar(A,sizeof(A),0);
B:= A; dm := 0;
Try(0,1,1);
writeln(fout,'So cach : ',dm);
close(fout); Time;
End;
{-------------------------------------}
BEGIN
Process;
END.
Cách ghi kết quả trong file Vtron.out như sau: trong mỗi dòng ghi một cách đặt các số theo thứ tự từ 1 đến 15 theo cách đánh số như trên hình vẽ. Số cách xếp được ghi ở cuối tệp.
(Lời giải của bạn Đỗ Thanh Tùng - Lớp 12 Tin - PTTH chuyên Thái Bình)
Bài 46/2000 - Đảo chữ cái
{$A+,B-,D+,E+,F-,G-,I+,L+,N-,O-,P-,Q-,R+,S+,T-,V+,X+,Y+}
{$M 16384,0,655360}
(*Du lieu vao: file 'inp.txt' voi cac tu khac nhau, moi tu ghi o mot dong;
Du lieu ra: file 'out.txt' *)
PROGRAM Sinh_hoan_vi;
USES Crt;
CONST
MAX = 100;
INP = 'inp.txt';
OUT = 'out.txt';
TYPE
STR = array[0..max] of char;
VAR
s :str;
f,g :text;
n :longint; { so luong tu}
time:longint ;
PROCEDURE Nhap_dl;
Begin
Assign(f,inp);
Assign(g,out);
Reset(f);
Rewrite(g);
Readln(f,n);
End;
PROCEDURE DocDay(var s:str);
Begin
Fillchar(s,sizeof(s),chr(0));
While not eoln(f) do
begin
s[0]:=chr(ord(s[0])+1);
read(f,s[ord(s[0])]);
end;
End;
PROCEDURE VietDay(s:str);
Var i :word;
Begin
For i:=1 to ord(s[0]) do Write(g,s[i]);
End;
PROCEDURE Sap_xep(l,r:word);{ giai thuat Quicksort}
Var i,j :word;
tg,tam :char;
Begin
i:=l;j:=r;
tg:=s[(l+r) div 2];
Repeat
While ord(s[i]) < ord(tg) do inc(i);
While ord(s[j]) > ord(tg) do dec(j);
If i<=j then
begin
tam:=s[i];
s[i]:=s[j];
s[j]:=tam;
inc(i);
dec(j);
end;
Until i>j;
If j>l then Sap_xep(l,j);
If i
End;
PROCEDURE Sinh_hv(s:str);
Var vti,vtj,i,j:word;
stop :boolean;
tam :char;
Begin
Writeln(g);
VietDay(s);
Repeat
Stop:=true;
For i:= ord(s[0]) downto 2 do
If s[i] > s[i-1] then
begin
vti:=i-1;
stop:=false;
For j:=ord(s[0]) downto vti+1 do
begin
If (ord(s[j])>ord(s[vti])) then
begin
vtj:=j;
break;
end;
end;
tam:=s[vtj];
s[vtj]:=s[vti];
s[vti]:=tam;
For j:=1 to ((ord(s[0]) - (vti+1))+1) div 2 do
begin
tam:=s[vti+j];
s[vti+j]:=s[ord(s[0])-j+1];
s[ord(s[0])-j+1]:=tam;
end;
Writeln(g);
VietDay(s);
break;
end;
Until stop;
End;
PROCEDURE Xu_ly;
Var i:longint;
Begin
For i:=1 to n do
begin
DocDay(s);
readln(f);
Sap_xep(1,ord(s[0]));
Sinh_hv(s);
Writeln(g);
end;
Close(f);
Close(g);
End;
BEGIN
Nhap_dl;
Xu_ly;
END.
(Lời giải của bạn Nguyễn Việt Bằng - Lớp 10 Tin - Trường phổ thông Năng Khiếu - ĐHQG TPHCM)
Bài 47/2000 - Xoá số trên vòng tròn
Lời giải 1:
Program vd;
Uses crt;
Var s:array[1..2000] of integer;
i:integer;
Begin
Clrscr;
for i:=0 to 1999 do s[i]:=i+1;
s[2000]:=1;
i:=1;
repeat
s[i]:=s[s[i]];
i:=s[i];
until
s[i]=i;
writeln(i);
readln;
End.
(Lời giải của bạn: Hà Huy Luân)
Lời giải 2:
Program xoa_so;
Const N=2000;
Var x:integer;
Function topow(x:integer):integer;
Var P:integer;
Begin
P:=1;
Repeat
p:=p*2;
Until p>x;
topow:=p div 2;
End;
BEGIN
x:=1+2*(N-topow(N));
write(x);
END.
(Lời giải của bạn: Nguyễn Quang Trung - Lớp 12A Trường HERMANN GMEINER, Đà Lạt, Lâm Đồng)
Lời giải 3:
(* Thuat Giai Xu ly Bit *)
USES Crt;
CONST
Max = 2000;
VAR
A: array[0..(MAX div 8)] of byte;
so: word;
FUNCTION Laybit(i:word):byte;
Var k:word;
Begin
k:=i div 8;
i:=i mod 8;
Laybit:=(a[k] shr (7-i)) and 1;
End;
PROCEDURE Tatbit(i:word);
Var k:word;
Begin
k:=i div 8;
i:=i mod 8;
a[k]:=a[k] and (not (1 shl (7-i)));
End;
FUNCTION Tim(j:word):word;
Begin
While (laybit(j+1)=0) do
begin
If j=max-1 then j:=0
else inc(j);
end;
Tim:=j+1;
End;
PROCEDURE Xuly;
Var j,dem,i :word;
Begin
j:=1;dem:=0;
Fillchar(a,sizeof(a),255);
Tatbit(0);
Repeat
If j=max then j:=0;
j:=tim(j);
Tatbit(j);
inc(dem);
If j=max then j:=0;
j:=tim(j);
Until dem=max-1;
For i:=0 to (max div 8) do
If a[i]<>0 then break;
so:=i * (1 shl 3);
For i:=so to so+7 do
If Laybit(i)=1 then break;
so:=i;
Writeln(' SO TIM DUOC LA :',SO:4);
Writeln(' Press Enter to Stop.....');
readln;
End;
BEGIN
Clrscr;
Xuly;
END.
(Lời giải của bạn: Nguyễn Việt Bằng - Lớp 10 Tin - Phổ thông Năng Khiếu - ĐHQG.TPHCM)
Bài 48/2000 - Những chiếc gậy
(Dành cho học sinh THPT)
Program bai48;
Var x:array[0..10000] of word;
d,a:array[1..1000] of byte;
n,p,s,gtmax:word;
fi,fo:text;
ok:boolean;
Procedure Q_sort(l,k:word);
Var h,i,j,t:word;
Begin
h:=a[(l+k)div 2];i:=l;j:=k;
Repeat
While a[i]>h do inc(i);
While a[j]
If i<=j then
Begin
t:=a[i];a[i]:=a[j];a[j]:=t;
inc(i);dec(j);
End;
Until i>j;
if i
if j>l then Q_sort(l,j);
End;
Procedure phan(var ok:boolean);
Var i,p1,j:word;
Begin
Fillchar(x,sizeof(x),0);x[0]:=1;
For i:=1 to n do
If (d[i]=0) then
For j:=p downto a[i] do
If (x[j]=0) and(x[j-a[i]]<>0) then
Begin
x[j]:=i;
if j=p then
Begin
j:=a[i];
i:=n;
End;
End;
ok:=(x[p]<>0);
if ok then
Begin
p1:=p;
Repeat
d[x[p1]]:=1;
p1:=p1-a[x[p1]];
Until p1=0;
End;
End;
Procedure chat(Var ok:boolean);
Var i:word;
Begin
Fillchar(d,sizeof(d),0);
Repeat
phan(ok);
Until not ok;
ok:=true;
for i:= n downto 1 do
if d[i]=0 then
Begin
ok:=false;
break;
End;
End;
Procedure Tinh;
Begin
For p:=gtmax to s div 2 do
Begin
chat(ok);
if ok then
Begin
writeln(fo,p);
break;
End;
End;
If not ok then
Writeln(fo,s);
End;
Procedure Start;
Var i:word;
Begin
assign(fi,'input.txt');reset(fi);
assign(fo,'output.txt');rewrite(fo);
While not seekeof(fi) do
Begin
Readln(fi,n);
if n<>0 then
Begin
gtmax:=0;s:=0;
for i:=1 to n do
Begin
Read(fi,a[i]);
s:=s+a[i];
if a[i]> gtmax then
gtmax:=a[i];
End;
Q_sort(1,n);
Tinh;
End;
End;
Close(fi);Close(fo);
End;
Begin
Start;
End.
9
5 2 1 5 2 1 5 2 1
4
1 2 3 4
0
(Lời giải của bạn Tăng Hải Anh - Hải Dương - TP. Hải Phòng)
Bài 49/2001 - Một chút nhanh trí
(Dành cho học sinh Tiểu học)
Theo giả thiết khi chia A và lập phương của A cho một số lẻ bất kỳ thì nhận được số dư như nhau, tức là: A3 (mod N) = A (mod N), ở đây N số lẻ bất kỳ, chọn N lẻ sao cho N > A3 thì ta phải có A3= A suy ra A=1.
Vậy chỉ có số 1 thoả mãn điều kiện của bài toán.
Bài 50/2001 - Bài toán đổi màu bi
(Dành cho học sinh THCS và PTTH)
Program ba_bi;
Uses crt;
var v,x,d:integer;
BEGIN
Clrscr;
writeln('v x d ?(>=0)');
readln(v,x,d);
if ((v-x)mod 3 =0)and((x+d)*(v+d)<>0) then
while (v+x)<>0 do
begin
d:=d-1+3*((3*v*x)div(3*v*x-1));
x:=x+2-3*((3*x)div(3*x-1));
v:=v+2-3*((3*v)div(3*v-1));
writeln('>> ',v,' ',x,' ',d);
end
else writeln('Khong duoc !');
readln;
END.
(Lời giải của bạn:Nguyễn Quang Trung)
Bài 51/2001 - Thay thế từ
(Dành cho học sinh THCS và PTTH)
program thaythetu;
var
source,des:array[1..50]of string;
n:byte;
procedure init;
var
i:byte;
s:string;
f:text;
begin
assign(f,'input2.txt');
reset(f);
n:=0;
while not eof(f) do
begin
readln(f,s);
inc(n);
while (s<>'')and(s[1]=' ') do
delete(s,1,1);
if i>0 then
begin
i:=pos(' ',s);
des[n]:=copy(s,1,i-1);
while (i<=length(s))and(s[i]=' ') do
i:=i+1;
source[n]:=copy(s,i,length(s)-i+1);
end;
end;
end;
procedure replace;
var
f,g:text;
s:string;
i,k:byte;
begin
assign(f,'input1.txt');
reset(f);
assign(g,'kq.out');
rewrite(g);
while not eof(f) do
begin
readln(f,s);
for k:=1 to n do
for i:=1 to length(s)-length(des[k])+1 do
if des[k]=copy(s,i,length(des[k])) then
begin
delete(s,i,length(des[k]));
insert(source[k],s,i);
i:=i+length(source[k]);
end;
writeln(g,s);
end;
close(f);
close(g);
end;
begin
init;
replace;
end.
Chia sẻ với bạn bè của bạn: |