100 đề Toán Tin Tin học & Nhà trường


Bài 35/2000 - Các phân số được sắp xếp



tải về 1.1 Mb.
trang16/22
Chuyển đổi dữ liệu26.07.2016
Kích1.1 Mb.
#6336
1   ...   12   13   14   15   16   17   18   19   ...   22

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.




tải về 1.1 Mb.

Chia sẻ với bạn bè của bạn:
1   ...   12   13   14   15   16   17   18   19   ...   22




Cơ sở dữ liệu được bảo vệ bởi bản quyền ©hocday.com 2024
được sử dụng cho việc quản lý

    Quê hương