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


Bài 100/2002 - Mời khách dự tiệc



tải về 1.1 Mb.
trang12/22
Chuyển đổi dữ liệu26.07.2016
Kích1.1 Mb.
#6336
1   ...   8   9   10   11   12   13   14   15   ...   22

Bài 100/2002 - Mời khách dự tiệc


(Dành cho học sinh THPT)

Công ty trách nhiệm hữu hạn “Vui vẻ” có n cán bộ đánh số từ 1 đến n. Cán bộ i có đánh giá độ vui tính là vi (i = 1, 2, ..., n). Ngoại trừ Giám đốc Công ty, mỗi cán bộ có 1 thủ trưởng trực tiếp của mình.

Bạn chỉ cần giúp Công ty mời một nhóm cán bộ đến dự dạ tiệc “Vui vẻ” sao cho trong số những người được mời không đồng thời có mặt nhân viên và thủ trưởng trực tiếp và đồng thời tổng đánh giá độ vui tính của những người dự tiệc là lớn nhất.

Giả thiết rằng mỗi một thủ trưởng có không quá 20 cán bộ trực tiếp dưới quyền.


Dữ liệu: Vào từ file văn bản GUEST.INP

- Dòng đầu tiên ghi số cán bộ của Công ty: n (1 < n < 1001);

- Dòng thứ i trong số n dòng tiếp theo ghi hai số nguyên dương ti, vi; trong đó ti là số hiệu của thủ trưởng trực tiếp và vi là độ vui tính của cán bộ i (i = 1, 2, ..., n). Quy ước ti = 0 nếu i là số hiệu của Giám đốc Công ty.
Kết quả: Ghi ra file văn bản GUEST.OUT

- Dòng đầu tiên ghi hai số m, v; trong đó m là tổng số cán bộ được mời còn v là tổng độ vui tính của các cán bộ được mời dự tiệc;

- Dòng thứ i trong số m dòng tiếp theo ghi số hiệu của cán bộ được mời thứ i (i = 1, 2, ..., m).

Ví dụ:


GUEST.INP

GUEST.OUT

3

0 3


1 6

2 4


2 7

1

3





GUEST.INP

GUEST.OUT

7

0 1


1 1

1 12


2 50

2 1


3 1

3 1


3 63

3

4



5

(Đề ra của bạn Lưu Văn Minh)

Phần II: LỜI GIẢI
Bài 1/1999 - Trò chơi cùng nhau qua cầu

(Dành cho học sinh Tiểu học)



Đáp số: 17 phút. Cách đi như sau:

Lượt 1: 2 + 1 sang, 1 quay về thời gian: 3 phút

Lượt 2: 10 + 5 sang, 2 quay về thời gian: 12 phút

Lượt 3: 2 + 1 sang thời gian: 2 phút

Tổng thời gian: 17 phút


Bài 2/1999 - Tổ chức tham quan

(Dành cho học sinh THCS)

Program bai2;

uses crt;

const fi = 'P2.inp';

fo = 'P2.out';

type _type=array[1..2] of integer;

mang=array[1..200] of _type;


var f:text;

d,v:mang;

m,n:byte;
procedure input;

var i:byte;

begin

assign(f,fi);



reset(f);

readln(f,n,m);

for i:=1 to n do

begin


read(f,d[i,1]);

d[i,2]:=i;

end;

readln(f);



for i:=1 to m do

begin


read(f,v[i,1]);

v[i,2]:=i;

end;

close(f);



end;
procedure sapxeptang(var m:mang;n:byte);

var d:_type;

i,j:byte;

begin


for i:=1 to n-1 do

for j:=i+1 to n do

if m[j,1]m[i,1] then

begin


d:=m[j];

m[j]:=m[i];

m[i]:=d;

end;


end;
var i:byte;

tong:integer;

begin

input;


sapxeptang(d,n);

sapxeptang(v,m);

tong:=0;

for i:=1 to n do tong:=tong+v[n-i+1,1]*d[i,1];

for i:=1 to n do v[i,1]:=d[n-i+1,2];

xapxeptang(v,n);

assign(f,fo);

rewrite(f);

writeln(f,tong);

for i:=1 to n do writeln(f,v[i,2]);

close(f);

end.
Nhận xét: Chương trình trên sẽ chạy chậm nếu chúng ta mở rộng bài toán (chẳng hạn n <= m <= 8000). Sau đây là cách giải khác:


const

Inp = 'P2.INP';

Out = 'P2.OUT';

var


n, m: Integer;

Val, Pos: array[1..2, 1..8000] of Integer;

procedure ReadInput;

var


i: Integer;

hf: Text;

begin

Assign(hf, Inp);



Reset(hf);

Readln(hf, n, m);

for i := 1 to n do Read(hf, Val[1, i]);

Readln(hf);

for i := 1 to m do Read(hf, Val[2, i]);

Close(hf);

for i := 1 to m do

begin


Pos[1, i] := i;

Pos[2, i] := i;

end;

end;


procedure QuickSort(t, l, r: Integer);

var


x, tg, i, j: Integer;

begin


x := Val[t, (l + r) div 2];

i := l; j := r;

repeat

while Val[t, i] < x do Inc(i);



while Val[t, j] > x do Dec(j);

if i <= j then

begin

Tg := Val[t, i]; Val[t, i] := Val[t, j]; Val[t, j] := Tg;



Tg := Pos[t, i]; Pos[t, i] := Pos[t, j]; Pos[t, j] := Tg;

Inc(i); Dec(j);

end;

until i > j;



if i < r then QuickSort(t, i, r);

if j > l then QuickSort(t, l, j);

end;

procedure WriteOutput;



var

i: Integer;

Sum: LongInt;

hf: Text;

begin

Sum := 0;



for i := 1 to n do Inc(Sum, Val[1, n - i + 1] * Val[2, i]);

for i := 1 to n do Val[1, Pos[1, n - i + 1]] := Pos[2, i];

Assign(hf, Out);

Rewrite(hf);

Writeln(hf, Sum);

for i := 1 to n do Writeln(hf, Val[1, i]);

Close(hf);

end;


begin

ReadInput;

QuickSort(1, 1, n);

QuickSort(2, 1, m);

WriteOutput;

end.
Bài 3/1999 - Mạng tế bào

(Dành cho học sinh THPT)

Program Bai3/1999;

uses crt;

const fi = 'P3.inp';

fo = 'P3.out';
type mang=array[0..201,0..201] of byte;
var m,n,t:byte;

s:string;

a:mang;

f:text;


b,c:^mang;
procedure input;

var i,j:byte;

begin

assign(f,fi);



reset(f);

readln(f,m,n,t);

readln(f,s);

for i:=1 to m do

begin

for j:=1 to n do read(f,a[i,j]);



end;

close(f);

new(b);

new(c);


end;
procedure hien;

var i,j:byte;

begin

for i:=1 to m do



for j:=1 to n do

begin


gotoxy(j*2,i);

write(b^[i,j]);

end;
end;
procedure trans(ch:char);

var i,j,d:byte;

begin

fillchar(c^,sizeof(mang),0);



for i:=1 to m do

for j:=1 to n do

begin

d:=b^[i,j];



case a[i,j] of

1:inc(c^[i,j-1],d);

2:inc(c^[i,j+1],d);

3:inc(c^[i-1,j],d);

4:inc(c^[i+1,j],d);

5:begin inc(c^[i-1,j],d);inc(c^[i+1,j],d); end;

6:begin inc(c^[i,j-1],d);inc(c^[i,j+1],d); end;

7:begin inc(c^[i,j-1],d);inc(c^[i-1,j],d); end;

8:begin inc(c^[i,j+1],d);inc(c^[i+1,j],d); end;

end;


end;

if ch<>'X' then b^[1,1]:=ord(ch)-48;

for i:=1 to m do

for j:=1 to n do

if (i<>1) or (j<>1) then b^[i,j]:=byte(c^[i,j]<>0);

hien;


readln;

end;
procedure output;

var i,j:byte;

begin


assign(f,fo);

rewrite(f);

for i:=1 to m do

begin


for j:=1 to n do write(f,' ',b^[i,j]);

writeln(f);

end;

close(f);



end;
var i:byte;

begin


clrscr;

input;


fillchar(b^,sizeof(mang),0);

fillchar(c^,sizeof(mang),0);

for i:=1 to t do trans(s[i]);

output;


end.
Bài 4/1999 - Trò chơi bốc sỏi

(Dành cho học sinh Tiểu học)

Huy sẽ là người thắng cuộc. Thật vậy số sỏi ban đầu là 101 là một số có dạng 5k+1, nghĩa là số nếu chia 5 sẽ còn dư 1. Hoàng phải bốc trước, do số sỏi của Hoàng phải lấy là từ 1 đến 4 do đó sau lượt đi đầu tiên, số sỏi còn lại sẽ lớn hơn 96. Huy sẽ bốc tiếp theo sao cho số sỏi còn lại phải là 96, nghĩa là số dạng 5k+1. Tương tự như vậy, Huy luôn luôn chủ động được để sau lần bốc của mình số sỏi còn lại là 5k+1. Lần cuối cùng số sỏi còn lại chỉ là 1 và Hoàng bắt buộc phải bốc viên cuối cùng và ... thua.

Bài toán tổng quát: có thể cho số viên bi là 5k+1 viên.

Bài 5/1999 - 12 viên bi

(Dành cho học sinh THCS)

Ta sẽ chỉ ra rằng tồn tại 3 lần cân để chỉ ra được viên bi đặc biệt đó.

Gọi các viên bi này lần lượt là 1, 2, ..., 12. Trong khi mô tả thuật toán ta dùng ký hiệu





để mô tả quả hòn bi thứ n





để mô tả một hòn bi bất kỳ





Mô tả một phép cân.

Ta gọi viên bi có trọng lượng khác là đđ.
I. Lần cân thứ nhất. Lấy ra 8 hòn bi bất kỳ và chia làm 2 phần để cân:



Có 2 trường hợp xảy ra:



1.1. Cân trên cân bằng. Suy ra viên bi đđ (không rõ nặng nhẹ) nằm trong 4 viên bi còn lại (không mang ra cân)

1.2. Cân trên không cân bằng.

1.2.1. Nếu (1) nhẹ hơn (2) suy ra hoặc đđ là nhẹ nằm trong (1) hoặc đđ là nặng nằm trong (2).

1.2.2. Nếu (1) nặng hơn (2) suy ra hoặc đđ là nặng nằm trong (1) hoặc đđ là nhẹ nằm trong (2).

Dễ thấy các trường hợp 1.2.1. và 1.2.2. là tương tự nhau.

Trong mọi trường hợp ta có kết luận đđ nằm trong số 8 viên hoặc nhẹ trong 4 hoặc nặng trong 4 còn lại.

II. Xét trường hợp 1.1: Tìm được 4 viên bi chứa đđ

Gọi các hòn bi này là 1, 2, 3, 4

Lần cân thứ hai:
Xét các trường hợp sau:

2.1. Cân thăng bằng. Kết luận: viên bi 4 chính là đđ.

2.2. Trường hợp cân trái nhẹ hơn phải (dấu <). Suy ra hoặc 3 là đđ nặng, hoặc 1 hoặc 2 là đđ nhẹ.

2.3. Trường hợp cân trái nặng hơn phải (dấu >). Suy ra hoặc 3 là đđ nhẹ, hoặc 1 hoặc 2 là đđ nặng.

Dễ thấy rằng các trường hợp 2.2. và 2.3. là tương tự nhau.



III. Xét trường hợp 2.1: viên bi 4 chính là đđ

Lần cân thứ ba:



Nếu cân nghiêng < thì 4 là đđ nhẹ, nếu cân nghiêng > thì 4 là đđ nặng.



IV. Xét trường hợp 2.2. Hoặc 3 là đđ nặng, hoặc 1 hoặc 2 là đđ nhẹ.

Lần cân thứ ba:




Nếu cân thăng bằng thì ta có 1 là hòn bi đđ nhẹ.

Nếu cân nghiêng > thì ta có 3 là hòn bi đđ nặng.

Nếu cân nghiêng < thì ta có 2 là hòn bi nhẹ.



V. Xét trường hợp 2.3. Hoặc 3 là đđ nhẹ, hoặc 1 hoặc 2 là đđ nặng.

Cách làm tương tự trường hợp 2.2 mô tả trong mục IV ở trên.



VI. Xét trường hợp 1.2.1.

Hoặc đđ là nhẹ trong 1, 2, 3, 4 hoặc đđ là nặng trong 5, 6, 7, 8.



Lần cân thứ hai:





6.1. Trường hợp cân thăng bằng. Suy ra đđ sẽ phải nằm trong 4, 7, 8, và do đó theo giả thiết của trường hợp này ta có hoặc đđ là 4 nhẹ, hoặc đđ là nặng trong 7, 8. Dễ nhận thấy trường hợp này hoàn toàn tương tự như 2.2. Bước tiếp theo làm tương tự như mô tả trong IV.

6.2. Trường hợp cân nghiêng <, suy ra hoặc đđ là nhẹ rơi vào 1, 2 hoặc đđ là 6 nặng. Trường hợp này cũng hoàn toàn tương tự như 2.2. Bước tiếp theo làm tương tự như mô tả trong IV.

6.3. Trường hợp cân nghiêng >, suy ra hoặc đđ là 5 nặng, hoặc đđ là nhẹ 3.

VII. Xét trường hợp 6.3.

Hoặc đđ là 5 nặng, hoặc đđ là 3 nhẹ.



Lần cân thứ ba:
Nếu cân thăng bằng, suy ra 5 là đđ nặng.

Nếu cân nghiêng < suy ra 3 là đđ nhẹ.

Tất cả các trường hợp của bài toán đã được xem xét.
Sau đây là chương trình chi tiết.
Program bai5;

Uses crt;

Const

st1=' nang hon.';



st2=' nhe hon.';

Var i, kq1: integer;

kq2: string;

ch: char;

(* Thủ tục Kq *)

Procedure kq(a: integer; b: string);

Begin

kq1:=a;


kq2:=b;

End;


(* Thủ tục Cân *)

Procedure can(lan: integer; t1, t2, t3, t4, p1, p2, p3, p4: string);

Begin

Writeln('Lần cân thứ', lan, ' :');



Writeln;

Writeln(' ', t1, ' ', t2, ' ', t3, ' ', t4, ' ', p1, ' ', p2, ' ', p3, ' ', p4);

Writeln;

Write(' Bên nào nặng hơn? Trái(t)/Phải(p)/ Hay cân bằng(c)');

Repeat

ch:=readkey;



ch:=upcase(ch);

Until (ch in ['P', 'T', 'C']);

Writeln(ch);

Writeln(*==========================================*);

End;

(* Thủ tục Play *)



Procedure play;

Begin


Writeln('Có 12 quả cân: 1 2 3 4 5 6 7 8 9 10 11 12');

Writeln('Cho phép bạn chọn ra một quả cân nặng hơn hay nhẹ hơn những quả khác.');

can(1, '1', '2', '3', '4', '5', '6', '7', '8');

If (ch='T') then {T}

Begin

can(2, '1', '2', '5', ' ', '3', '4', '6', ' ');



If (ch='T') then {TT}

Begin


can(3, '1', '6', ' ', ' ', '7', '8', ' ', ' ');

If ch='T' then kq(1, st1); {TTT}

If ch='P' then kq(6, st2); {TTP}

If ch='C' then kq(2, st1); {TTC}

End

Else If (ch='P') then {TP}



Begin

can(3, '3', '5', ' ', ' ', '7', '8', ' ', ' ');

If ch='T' then kq(3, st1); {TPT}

If ch='P' then kq(5, st2); {TPP}

If ch='C' then kq(4, st1); {TPC}

End


Else If (ch='C') then {TC}

Begin


can(3, '7', ' ', ' ', ' ', ' ', '8', ' ', ' ');

If ch='T' then kq(8, st2); {TCT}

If ch='P' then kq(7, st2); {TCP}

If ch='C' then

Begin

Writeln('Trả lời sai!'); kq2:=st2;



End;

End;


End

Else If (ch='P') then {P}

Begin

can(2, '5', '6', '1', ' ', '7', '8', '2', ' ');



If (ch='T') then {PT}

Begin


can(3, '5', '2', ' ', ' ', '3', '4', ' ', ' ');

If ch='T' then kq(5, st1);

If ch='P' then kq(2, st2);

If ch='C' then kq(6, st1);

End

Else If (ch='P') then {PP}



Begin

can(3, '7', '1', ' ', ' ', '3', '4', ' ', ' ');

If ch='T' then kq(7, st1);

If ch='P' then kq(1, st2);

If ch='C' then kq(8, st1);

End


Else If (ch='C') then {PC}

Begin


can(3, '3', ' ', ' ', ' ', ' ', '4', ' ', '');

If ch='T' then kq(4, st2);

If ch='P' then kq(3, st2);

If ch='C' then

Begin

Writeln('Trả lời sai !'); kq2:=st2;



End;

End;


End

Else If (ch='C') then {C}

Begin

can(2, '9', '10', '11', ' ', '1', '2', '3', ' ');



If (ch='T') then

{CT}


Begin

can(3, '9', ' ', ' ', ' ', '10', ' ', ' ', ' ');

If (ch='T') then kq(9, st1);

If (ch='P') then kq(10, st1);

If (ch='C') then kq(11, st1);

End


Else If (ch='P') then {CP}

Begin


can(3, '9', ' ', ' ', ' ', '10', ' ', ' ', ' ');

If (ch='T') then kq(10, st2);

If (ch='P') then kq(9, st2);

If (ch='C') then kq(11, st2); End

Else If (ch='C') then {CC}

Begin


can(3, '12', ' ', ' ', ' ', '1', ' ', ' ', ' ');

If (ch='T') then kq(12, st1);

If (ch='P') then kq(12, st2);

If (ch='C') then Writeln('Trả lời sai!');

kq1:=12;

End;


End;

End;


(* Chương trình chính*)

Begin


Clrscr;

play;


Writeln(' Quả thứ', kq1, kq2);

Writeln(' Nhấn Enter kết thúc...');

Readln;

End.
Bài 6/1999 - Giao điểm các đường thẳng

(Dành cho học sinh THPT)

Program Bai6;


(* Tinh so giao diem cua n duong thang 0 trung nhau *)
Uses Crt;
Const
fn = 'P6.INP';
fg = 'P6.OUT';
max = 100;
exp = 0.0001;
Var
a ,b ,c : array[1..max] of real;
n : integer;
sgd : integer;
Procedure Nhap;
Var
f: text;
i: integer;
Begin
Assign( f ,fn ); Reset( f );
Readln( f ,n );
For i := 1 to n do
Readln( f ,a[i] ,b[i] ,c[i] ); { ax + by = c }
Close( f );
End;
(*--------------------------------------------------------------------------*)
Procedure Chuanbi;
Begin
sgd := 0;
End;
(*--------------------------------------------------------------------------*)
Function Giaodiem( i ,j : integer;Var x ,y : real ) : boolean;
Var
d ,dx ,
dy : real;
Begin
d := a[i] * b[j] - a[j] * b[i];
dx := c[i] * b[j] - c[j] * b[i];
dy := a[i] * c[j] - a[j] * c[i];
If d <> 0 then
begin
x := dx / d;
y := dy / d;
end;
giaodiem := d <> 0;
End;
(*--------------------------------------------------------------------------*)
Function Giatri( i : integer;x ,y : real ) : real;
Begin
Giatri := a[i] * x + b[i] * y - c[i];
End;
(*--------------------------------------------------------------------------*)
Function bang( a ,b : real ) : boolean;
Begin
bang := abs( a - b ) <= exp;
End;
(*--------------------------------------------------------------------------*)
Function Thoaman( i ,j : integer;x ,y : real ) : boolean;
Var
ii: integer;
Begin
Thoaman := false;
For ii := 1 to i - 1 do
If (ii <> j) and bang( giatri( ii ,x ,y ) ,0 ) then
exit;
Thoaman := true;
End;
(*--------------------------------------------------------------------------*)
Function Catrieng( i : integer ) : integer;
Var
ii , gt:integer;
x, y : real;
Begin
gt := 0;
For ii := 1 to i do
If giaodiem( i ,ii ,x ,y ) then
If thoaman( i ,ii ,x ,y ) then Inc( gt );
catrieng := gt;
End;
(*--------------------------------------------------------------------------*)
Procedure Tinhsl;
Var
i : integer;
Begin
For i := 1 to n do
Inc( sgd ,catrieng( i ) );
End;
(*--------------------------------------------------------------------------*)
Procedure GhiKQ;
Begin
Writeln(So giao diem cua cac duong thang la: ' ,sgd );
End;
(*--------------------------------------------------------------------------*)
BEGIN
ClrScr;
Nhap;
Chuanbi;
Tinhsl;
ghiKQ;
END.
Bài 7/1999 - Miền mặt phẳng chia bởi các đường thẳng

(Dành cho học sinh THPT)

Program Bai7;
(* Tinh so giao diem cua n duong thang ko trung nhau *)
Uses Crt;
Const
fn = 'P7.INP';
fg = 'P7.OUT';
max = 100;
exp = 0.0001;
Var
a ,b ,c : array[1..max] of real;
n : integer;
smien : integer;
Procedure Nhap;
Var
f : text;
i : integer;
Begin
Assign( f ,fn ); Reset( f );
Readln( f ,n );
For i := 1 to n do
Readln( f ,a[i] ,b[i] ,c[i] ); { ax + by = c }
Close( f );
End;
(*--------------------------------------------------------------------------*)
Procedure Chuanbi;
Begin
smien := 1;
End;
(*--------------------------------------------------------------------------*)
Function Giaodiem( i ,j : integer;Var x ,y : real ) : boolean;
Var
d ,dx ,dy :real;
Begin
d := a[i] * b[j] - a[j] * b[i];
dx:= c[i] * b[j] - c[j] * b[i];
dy := a[i] * c[j] - a[j] * c[i];
If d <> 0 then
begin
x := dx / d;
y := dy / d;
end;
Giaodiem := d <> 0;
End;
(*--------------------------------------------------------------------------*)
Function Giatri( i : integer;x ,y : real ) : real;
Begin
Giatri := a[i] * x + b[i] * y - c[i];
End;
(*--------------------------------------------------------------------------*)
Function bang( a ,b : real ) : boolean;
Begin
bang := abs( a - b ) <= exp;
End;
(*--------------------------------------------------------------------------*)
Function Thoaman( i : integer;x ,y : real ) : boolean;
Var
ii : integer;
Begin
Thoaman := false;
For ii := 1 to i - 1 do
If bang( Giatri( ii ,x ,y ) ,0 ) then
exit;
Thoaman := true;
End;
(*--------------------------------------------------------------------------*)
Function Cattruoc( i : integer ) : integer;
Var
ii , gt : integer;
x, y : real;
Begin
gt:= 0;
For ii := 1 to i - 1 do
If Giaodiem( i ,ii ,x ,y ) then
If Thoaman( ii ,x ,y ) then Inc( gt );
cattruoc := gt;
End;
(*--------------------------------------------------------------------------*)
Procedure Tinhslmien;
Var
i : integer;
Begin
For i := 1 to n do
Inc( smien ,cattruoc( i ) + 1 );
End;
(*--------------------------------------------------------------------------*)
Procedure GhiKQ;
Begin
Writeln(So mien mat phang duoc chia la: ' ,smien );
End;
(*--------------------------------------------------------------------------*)
BEGIN
Clrscr;
Nhap;
Chuanbi;
Tinhslmien;
GhiKQ;
END.
Bài 8/1999 - Cân táo

(Dành cho học sinh Tiểu học)

Số lần cân ít nhất là 3. Cách cân như sau:

Lần 1: Chia 27 quả táo thành 3 phần, mỗi phần 9 quả. Đặt 2 phần lên 2 đĩa cân. Nếu cân thăng bằng thì quả táo nhẹ nằm ở phần chưa cân, nếu cân lệch thì quả táo nhẹ nằm ở đĩa cân nhẹ hơn. Sau lần cân thứ nhất, ta chọn ra được 9 quả táo trong đó có quả táo nhẹ.

Lần 2: Chia 9 quả táo, chọn được ra thành 3 phần, mỗi phần 3 quả. Đặt 2 phần lên 2 đĩa cân. Nếu cân thăng bằng thì quả táo nhẹ nằm ở phần chưa cân, nếu cân lệch thì quả táo nhẹ nằm ở đĩa cân nhẹ hơn. Sau lần cân thứ 2, ta chọn ra được 3 quả táo trong đó có quả táo nhẹ.

Lần 3: Lấy 2 trong số 3 quả táo chọn đặt lên 2 đĩa cân. Nếu cân thăng bằng thì quả táo nhẹ là quả táo còn lại, nếu cân lệch thì quả táo nhẹ nằm ở đĩa cân nhẹ hơn. Sau ba lần cân ta chọn ra được quả táo nhẹ.


Bài 9/1999 - Bốc diêm

(Dành cho học sinh Tiểu học)

Nếu số lượng que diêm của mỗi dãy là: 3, 5, 8 thì hai bạn Nga và An bạn nào bốc trước sẽ thắng. Có nhiều cách để người bốc trước sẽ thắng. Giả sử:

- Dãy thứ nhất cso 8 que diêm.

- Dãy thứ hai có 5 que diêm.

- Dãy thứ hai có 3 que diêm.

Nếu Nga là người bốc trước để thắng, Nga sẽ làm như sau:

1. Bốc hết 8 que diêm ở dãy đầu tiên. Như vậy còn 2 dãy tổng cộng 8 que. An sẽ phải bốc một số que ở một trong hai dãy này.

2. Trong trường hợp sau khi An bốc số diêm chỉ còn ở trên một dãy, Nga sẽ bốc tất cả số diêm còn lại và sẽ thắng. Nếu sau khi An bốc mà số diêm vẫn còn ở trên hai dãy thì Nga cũng sẽ phải bốc sao cho đưa An vào thế bất lợi: mỗi dãy trong 2 dãy cuối cùng còn đúng một que diêm. Nếu chưa đưa An được vào thế bất lợi thì phải bốc sao cho mình không phải ở thế bất lợi. Chẳng hạn như:

- An bốc 3 que diêm ở dãy thứ 2. Nga sẽ bốc 1 que ở dãy cuối cùng.

- An bốc 1 que diêm tiếp theo cũng ở dãy đó. Nga cũng sẽ bốc 1 que ở dãy thứ 3.

- An bốc 1 que tiếp theo. Khi đó, Nga bốc que diêm cuối cùng và thắng cuộc.

Các bạn cũng có thể thử cho các trường hợp khác.
Bài 10/1999 - Dãy số nguyên

(Dành cho học sinh THCS)

Dãy đã cho là dãy các số tự nhiên viết liền nhau:

123456789 101112...99 100101102...999 100010011002...9999 10000...

9 x 1 = 9

90 x 2 = 180

900 x 3 = 2700

9000 x 4 = 36000 ...

Ta có nhận xét sau:

- Đoạn thứ 1 có 9 chữ số;

- Đoạn thứ 2 có 180 chữ số;

- Đoạn thứ 3 có 2700 chữ số;

- Đoạn thứ 4 có 36000 chữ số;

- Đoạn thứ 5 có 90000 x 5 = 450000 chữ số ...

Với k = 1000 ta có: k = 9 + 180 + 3.270 + 1.

Do đó, chữ số thứ k là chữ số đầu tiên của số 370, tức là chữ số 3.

Chương trình:

Program Bai10;

Uses crt;

Var k: longInt;

(*--------------------------------------------*)

Function chuso(NN: longInt):char;

Var st:string[10];

dem,M:longInt;

Begin

dem:=0;


M:=1;

Repeat


str(M,st);

dem := dem+length(st);

inc(M);

Until dem >= NN;



chuso := st[length(st) - (dem - NN)]

(*-------------------------------------*)

BEGIN

clrscr;;


write('Nhap k:');

Readln(k);

Writeln('Chu so thu', k,'cua day vo han cac so nguyen khong am');

write('123456789101112... la:', chu so(k));

Readln;

END.


Cách giải khác:

var n, Result: LongInt;


procedure ReadInput;

begin


Write('Ban hay nhap so K: '); Readln(n);

end;
procedure Solution;

var

i, Sum, Num, Digits: LongInt;



begin

Sum := 9; Num := 1; Digits := 1;

while Sum < n do

begin


Num := Num * 10; Inc(Digits);

Inc(Sum, Num * 9 * Digits);

end;

Dec(Sum, Num * 9 * Digits); Dec(n, Sum);



Num := Num + (n - 1) div Digits;

n := (n - 1) mod Digits + 1;

for i := 1 to Digits - n do Num := Num div 10;

Result := Num mod 10;

end;
procedure WriteOutput;

begin


Writeln('Chu so can tim la: ', Result);

Readln;


end;

begin


ReadInput;

Solution;

WriteOutput;

end.
Bài 11/1999 - Dãy số Fibonaci

(Dành cho học sinh THCS)

{$R+}


const

Inp = 'P11.INP';

Out = 'P11.OUT';

Ind = 46;

var

n: LongInt;



Fibo: array[1..Ind] of LongInt;

procedure Init;

var

i: Integer;



begin

Fibo[1] := 1; Fibo[2] := 1;

for i := 3 to Ind do Fibo[i] := Fibo[i - 1] + Fibo[i - 2];

end;


procedure Solution;

var


i: LongInt;

hfi, hfo: Text;

begin

Assign(hfi, Inp);



Reset(hfi);

Assign(hfo, Out);

Rewrite(hfo);

while not Eof(hfi) do

begin

Readln(hfi, n);



Write(hfo, n, ' = ');

i := Ind; while Fibo[i] > n do Dec(i);

Write(hfo, Fibo[i]);

Dec(n, Fibo[i]);

while n > 0 do

begin


Dec(i);

if n >= Fibo[i] then

begin

Write(hfo, ' + ', Fibo[i]);



Dec(n, Fibo[i]);

end;


end;

Writeln(hfo);

end;

Close(hfo);



Close(hfi);

end;


begin

Init;


Solution;

end.
Bài 12/1999 - N-mino

(Dành cho học sinh THPT)

Program Bai12;{Tinh va ve ra tat ca Mino}


Uses Crt;
Const fn = 'NMINO.INP';
    fg = 'NMINO.OUT';
    max = 16;
Type   bang =    array[0..max+1,0..max+1] of integer;
Var    n : integer;
    lonmin     : integer;
    hinh ,hinh1 ,xet ,dd :    bang;
    hang ,cot: array[1..max] of integer;
   sl : integer;
    qi,qj :    array[1..max*max] of integer;
   sh ,sc    :integer;
    hangthieu , cotthieu:integer;
    slch :    longint;
   f : text;

Procedure Nhap;


Var f:text;
Begin
Assign(f,fn); Reset(f);
Readln(f ,n);
Close(f);
End;

Procedure Chuanbi;


Begin
lonmin:= trunc(sqrt(n));
If n <> sqr(lonmin) then Inc(lonmin);
slch := 0;
End;

Function min2( a ,b : integer ) : integer;


Begin
If a < b then min2 := a Else min2 := b;
End;

Procedure Taobien( i ,j : integer );


Var ii ,jj : integer;
Begin
FillChar(dd ,SizeOf(dd),1);
FillChar(xet,SizeOf(xet),1);
For ii := 1 to i do
For jj := 1 to j do
begin
dd[ii,jj] := 0;
xet[ii,jj]    :=    0;
end;
End;

Procedure Ghinhancauhinh;


Var i ,j :    integer;
Begin
Inc(slch);
Writeln(f,sh ,' ' ,sc);
For i := 1 to sh do
begin
For j := 1 to sc do Write(f,(dd[i,j] mod 2):2);
Writeln(f)
end;
End;

Procedure Quaytrai;


Var hinh1 : bang;
i,j : integer;
Begin
hinh1:= hinh;
For i := 1 to sh do
For j := 1 to sc do hinh[i,j] := hinh1[sc-j+1,i];
End;

Procedure Lathinh;


Var hinh1 : bang;
i ,j : integer;
Begin
hinh1:= hinh;
For i := 1 to sh do
For j := 1 to sc do hinh[i,j] := hinh1[sh-i+1,sc-j+1];
End;

Procedure Daohinh;


Var hinh1 : bang;
i,j : integer;
Begin
hinh1 := hinh;
For i := 1 to sh do
For j := 1 to sc do hinh[i,j] := hinh1[sh-i+1,j];
End;

Function Bethat : boolean;


Var ii,jj    :integer;
Begin
Bethat := false;
For ii := 1 to sh do
For jj := 1 to sc do
If hinh[ii,jj] <> hinh1[ii,jj] then
begin
Bethat:= hinh[ii,jj] < hinh1[ii,jj];
exit;
end;
End;

Function Behon : boolean;


Begin
Behon := Bethat;
End;

Function Xethinhvuong : boolean;


Begin
Xethinhvuong :=    false;
Quaytrai;
If Behon then exit; Quaytrai;
If Behon then exit; Quaytrai;
If Behon then exit; Daohinh;
If Behon then exit; Quaytrai;
If Behon then exit; Quaytrai;
If Behon then exit; Quaytrai;
If Behon then exit; Xethinhvuong := true;
End;

Function Xetchunhat : boolean;


Begin
Xetchunhat := false;
Lathinh;
If Behon then exit; Daohinh;
If Behon then exit; Lathinh;
If Behon then exit; Xetchunhat := true;
End;

Procedure Chuyensang( a : bang;Var b : bang );


Var         i,j:integer;
Begin
For i := 1 to sh do
For j := 1 to sc do b[i,j] := a[i,j] mod 2;
End;

Procedure Thughinhancauhinh;


Begin
Chuyensang(dd ,hinh);
hinh1:=    hinh;
If sh = sc then begin If not Xethinhvuong then exit; end
Else If not Xetchunhat then exit;
Ghinhancauhinh;
End;

Procedure Xetthem( i ,j : integer );


Begin
Inc(xet[i,j]);
If xet[i,j] = 1 then
begin
Inc(sl);
qi[sl] := i;
qj[sl] := j
end;
End;

Procedure Xetbot( i ,j : integer );


Begin
If xet[i,j] = 1 then Dec(sl);
Dec( xet[i,j] );
End;

Procedure Themdiem( ii : integer );


Var i ,j : integer;
Begin
i := qi[ii];
j := qj[ii];
dd[i,j] := 1;
If dd[i,j-1] = 0 then Xetthem(i ,j-1);
If dd[i,j+1] = 0 then Xetthem(i ,j+1);
If dd[i-1,j] = 0 then Xetthem(i-1,j);
If dd[i+1,j] = 0 then Xetthem(i+1,j);
End;

Procedure Bodiem( ii : integer );


Var i , j    : integer;
Begin
i := qi[ii];
j := qj[ii];
dd[i,j] := 0;
If dd[i,j-1] = 0 then Xetbot(i,j-1);
If dd[i,j+1] = 0 then Xetbot(i,j+1);
If dd[i-1,j] = 0 then Xetbot(i-1,j);
If dd[i+1,j] = 0 then Xetbot(i+1,j);
End;

Procedure Xethangcot( ii : integer );


Var i ,j    :integer;
Begin
i := qi[ii];
j := qj[ii];
Inc(hang[i]);
If hang[i] = 1 then Dec(hangthieu);
Inc(cot[j]);
If cot[j] = 1 then Dec(cotthieu);
End;

Procedure Xetlaihangcot( ii : integer );


Var i,j :    integer;
Begin
i := qi[ii];
j := qj[ii];
If hang[i] = 1 then Inc(hangthieu);
Dec(hang[i]);
If cot[j] = 1 then Inc(cotthieu);
Dec(cot[j]);
End;

Procedure Duyet( i : integer;last : integer );


Var ii :integer;
Begin
If i > n then
begin thughinhancauhinh; exit; end;
For ii := last + 1 to sl do
begin
themdiem(ii);
xethangcot(ii);
If hangthieu + cotthieu <= n - i then duyet(i+1,ii);
Xetlaihangcot(ii);
bodiem(ii);
end;
End;

Procedure Duyetcauhinh( i ,j : integer );


Var jj :    integer;
Begin
sh := i;
sc := j;
FillChar(hang ,SizeOf(hang),0);
FillChar(cot,SizeOf(cot),0);
hangthieu := sh;
cotthieu := sc;
taobien(i ,j);
For jj := 1 to j do
begin
sl:= 1;
qi[1] := 1;
qj[1] := jj;
duyet(1,0);
dd[1,jj] := 2;
end;
End;

Procedure Duyethinhbao;


Var i ,j :  integer;
minj ,maxj :  integer;
Begin
For i := lonmin to n do
begin
minj := (n-1) div i + 1;
maxj := min2(n+1-i,i);
For j := minj to maxj do duyetcauhinh(i,j);
end;
End;

Procedure Ghicuoi;


Var f : file of char;
s : string;
i : integer;
Begin
str(slch,s);
Assign(f,fg); reset(f);
Seek(f,0);
For i := 1 to length(s) do Write(f,s[i]);
Close(f);
End;

BEGIN
Clrscr;


Assign(f,fg); Rewrite(f);
Writeln(f ,' ');
Nhap;
Chuanbi;
duyethinhbao;
Close(f);
ghicuoi;
END.
Bài 13/1999 - Phân hoạch hình chữ nhật

(Dành cho học sinh THPT)

{Recommend:m,n<5}

const m=4;n=4;max=m*n;

var

   a: array[1..m,1..n] of byte;



   i1,j1,dem,daxep,tg: integer;

   f: text;

   time: longint absolute $0:$46C;

   save: longint;

{------------------------------------}

procedure init;

begin

 for i1:=1 to m do



   for j1:=1 to n do a[i1,j1]:=0;

 dem:=0; daxep:=0; tg:=0;

end;

{------------------------------------}



procedure kq;

begin


 for i1:=1 to m do

 begin


   for j1:=1 to n do write(f,a[i1,j1],' ');

   writeln(f);

 end;

end;


{------------------------------------}

procedure try(i,j: integer);

var i2,j2,flag: integer;

begin


 if (daxep=max) then begin kq; writeln(f); tg:=tg+1; end

 else


 begin

   flag:=j;

   while (flag

   if (a[i,flag]<>0) then flag:=flag-1;

   for i2:=i to m do for j2:=j to flag do

   begin


     dem:=dem+1;

     for i1:=i to i2 do for j1:=j to j2 do a[i1,j1]:=dem;

     daxep:=daxep+(i2-i+1)*(j2-j+1);

     i1:=i;j1:=j2;

     while (a[i1,j1]<>0) do

     begin

       j1:=j1+1;

       if j1=n+1 then begin j1:=1; i1:=i1+1; end;

     end;

     try(i1,j1);

     daxep:=daxep-(i2-i+1)*(j2-j+1);

     for i1:=i to i2 do

       for j1:=j to j2 do a[i1,j1]:=0;

     dem:=dem-1;

   end;

 end;


end;

{------------------------------------}

BEGEN

 init;


 assign(f,'kq.dat'); rewrite(f);

 save:=time;

 try(1,1);

 write(f,tg);

 close(f);

 write('Time is about:',(time-save)/18.2);

 readln;

END.
Bài 14/2000 - Tìm số trang sách của một quyển sách

(Dành cho học sinh Tiểu học)

Để tiện tính toán, ta sẽ đánh số lại quyển sách bằng các số 001, 002, 003,..., 009, 010, 011, 012, 013,..., 098, 099, 100, 101,... tức là mỗi số ghi bằng đúng 3 chữ số. Như vậy ta phải cần thêm 9x2=18 chữ số cho các số trước đây chỉ có 1 chữ số và 90 chữ số cho các số trước đây chỉ có 2 chữ số, tổng cộng ta phải dùng thêm 108 chữ số. Với cách đánh số mới này, ta phải cần tới 1392+108=1500 chữ số. Vì mỗi số có đúng 3 chữ số nên có tất cả 1500:3=500 số, bắt đầu từ 001. Vậy quyển sách có 500 trang.


Bài 15/2000 - Hội nghị đội viên

(Dành cho học sinh Tiểu học)

Để tiện tính toán, cứ mỗi một cặp bạn trai-bạn gái quen nhau ta sẽ nối lại bằng một sợi dây. Như vậy mỗi bạn sẽ bị "buộc" bởi đúng N sợi dây vì quen với N bạn khác giới. Gọi số bạn trai là T thì tính được số dây nối là TxN. Gọi số bạn gái là G thì tính được số dây nối là GxN. Nhưng vì 2 cách tính cho cùng kết quả là số dây nối nên TxN=GxN, suy ra T=G. Vậy trong hội nghị đó số các bạn trai và các bạn gái là như nhau.
Bài 16/2000 - Chia số

(Dành cho học sinh THCS)

Lập một bảng 2NxN ô. Lần lượt ghi N2 số 1, 2, 3,...,  N2-1, N2 vào N cột, mỗi cột N số theo cách sau:


1

 

 

 

 

2

N+1

 

 

 

3

N+2

2N+1

 

 

...

...

...

...

...

N

2N-1

3N-2

...

(N-1)N+1

 

2N

3N-1

...

N2-(N-2)

 

 

3N

...

N2-(N-3)

 

 

 

...

N2-(N-4)

 

 

 

 

...

 

 

 

 

 

Trong N hàng trên, tổng i số trong hàng thứ i là:

i+[N+(i-1)]+[2N+(i-2)]+...+[(i-1)N+1]

= N[1+2+...+(i-1)]+[i+(i-1)+(i-2)+...+1]

= Ni(i-1)/2+i(i+1)/2

= (Ni2-Ni+i2+i)/2

Trong N hàng dưới, tổng (N-i) số trong hàng thứ N+i là

(i+1)N+[(i+2)N-1]+[(i+3)N-2]+...+[N2-(N-i-1)]

= N[(i+1)+(i+2)+...+N]-[1+2+...+(N-i-1)]

= N(N+i+1)(N-i)/2 - (N-i-1)(N-i)/2

= (N2+Ni+i+1)(N-i)/2

= (N3+Ni+N-Ni2-i2-i)/2

Cắt đôi bảng ở chính giữa theo đường kẻ đậm và ghép lại thành một bảng vuông như sau:


1

2N

3N-1

...

N2-(N-2)

2

N+1

3N

...

N2-(N-3)

3

N+2

2N+1

...

N2-(N-4)

...

...

...

...

...

N

2N-1

3N-2

...

(N-1)N+1

Khi đó tổng các số trong hàng thứ i là

(Ni2-Ni+i2+i)/2 + (N3+Ni+N-Ni2-i2-i)/2  =  (N3+N)/2 = N(N2+1)/2

Rõ ràng trong mỗi hàng có N số và tổng các số trong mỗi hàng là như nhau.


Bài 17/2000 - Số nguyên tố tương đương

(Dành cho học sinh THCS)

Có thể viết chương trình như sau:

Program Nttd;

Var M,N,d,i: integer;

{------------------------------------}

Function USCLN(m,n: integer): integer;

Var r: integer;

Begin

 While n<>0 do



 begin

   r:=m mod n; m:=n; n:=r;

 end;

 USCLN:=m;



End;

{------------------------------------}

BEGIN

 Write('Nhap M,N: '); Readln(M,N);



 d:=USCLN(M,N); i:=2;

 While d<>1 do

 begin

   If d mod i =0 then



   begin

     While d mod i=0 do d:=d div i;

     While M mod i=0 do M:=M div i;

     While N mod i=0 do N:=N div i;

   end;

   Inc(i);



 end;

 If M*N=1 then Write('M va N nguyen to tuong duong.')

 Else Write('M va N khong nguyen to tuong duong.');

 Readln;


END.
Bài 18/2000 - Sên bò

(Dành cho học sinh THCS và THPT)

Ta có thể thấy ngay là con sên phải đi N bước (vì xi+1 = xi+1), và nếu đi lên k bước thì lại di xuống k bước (vì yN = y0 = 0). Do đó, h = N div 2;

Chương trình có thể viết như sau:

Program Senbo;

Uses Crt, Graph;

Var f:Text;

gd, gm, N, W,xo,yo:Integer;

Procedure Nhap;

Begin


Write('Nhap so N<50:');Readln(N);

If N>50 Then N:=50;

End;

Procedure Veluoi;



Var i,j,x,y:Integer;

Begin


W:=(GetMaxX -50) Div N;

yo:=GetMaxY-100;

xo:=(GetMaxX-W*N) Div 2-25;

For i:=0 To N Do

For j:=0 To N Div 2 Do

Begin


x:=i*W+xo;

y:=yo-J*W;

Bar(x-1,y-1,x+1,y+1);

End;


End;
Procedure Bo

Var i,j,xo,yo,x,y:Integer;

Sx,Sy,S:String;

Begin


j:=0;xo:=xo;y:=yo;

Writeln(f,N:2,N Div 2:3);

SetColor(2);

OutTextXY(xo,yo+5,'(0,0)');

For i:=1 To N Do

Begin


If i<=N-i Then Inc(j)

Else If j>0 Then Dec(j);

Writeln(f,i:2,j:3);

x:=i*W+xo;y:=yo-j*W;

Line(xo,yo,x,y);

Str(i,sx);str(j,sy);

S:='('+sx+','+sy+')');

OutTextXY(x,y+5,s);

Delay(10000);

xo:=x;yo:=y;

End;

End;
Begin



Nhap;

Assign(F,'P5.Out');

ReWrite(F);

Dg:=Detect;

InitGraph(Gd,Gm,'');

VeLuoi;


Bo;

Readln;


Close(F);

CloseGraph;

End.
Bài 19/2000 - Đa giác

(Dành cho học sinh THPT)

Ta sẽ chứng minh khẳng định sau cho n 3:

Các số thực dương a1, a2, a3,..., an lập thành các cạnh liên tiếp của một đa giác n cạnh khi và chỉ khi với mọi k=1, 2,..., n ta có các bất đẳng thức sau:

a1 + a2 +... (thiếu k)... + an > ak                   (1)

(tổng của n-1 cạnh bất kỳ phải lớn hơn độ dài cạnh còn lại)

Chứng minh

Chứng minh được tiến hành qui nạp theo n. Với n = 3 thì (1) chính là bất đẳng thức tam giác quen thuộc.

Giả sử (1) đúng đến n. Xét (1) cho trường hợp n+1.

Trước tiên ta có nhận xét sau: Các số a1, a2,..., an, an+1 lập thành một đa giác n +1 cạnh khi và chỉ khi tồn tại một số g sao cho a1, a2, a3,..., an-1, g tạo thành một đa giác n cạnh và g, an, an+1 tạo thành một tam giác.

Giả sử a1, a2, a3,..., an, an+1 lập thành một đa giác n +1 cạnh. Khi đó theo nhận xét trên thì tồn tại đa giác n cạnh a1, a2, a3,..., an-1, g và tam giác g, an, an+1. Do đó ta có các bất đẳng thức sau suy từ giả thiết qui nạp và bất đẳng thức tam giác:

a1 + a2 + a3 +.... + an-1 > g                             (2)

an + an+1 > g > |an - an+1|                                (3)

Do vậy ta có

a1 + a2 + a3 +.... + an-1 > |an - an+1|                 (4)

từ (4) suy ra ngay các khẳng định sau:

a1 + a2 + a3 +.... + an-1 + an > an+1                    (5)

a1 + a2 + a3 +.... + an-1 + an+1 > an                    (6)

Mặt khác từ giả thiết qui nạp cho đa giác n cạnh a1, a2, a3,..., an-1, g, tương tự như (2) ta có các bất đẳng thức sau với k < n:

a1 + a2 +... (thiếu k)... + an-1 + g > ak

thay thế vế trái của (3) ta phải có với k

a1 + a2 +... (thiếu k)... + an-1 + an + an+1 > ak    (7)

Các bất đẳng thức (5), (6) và (7) chính là (1). Điều kiện cần được chứng minh.

Giả sử ngược lại, hệ bất đẳng thức (1) thoả mãn, ta có

a1 + a2 +... + an-1 + an > an+1                            (8)

a1 + a2 +... + an-1 + an+1 > an                            (9)

và với mọi k < n ta có:

a1 + a2 +...(thiếu k)... + an-1 + an + an+1 > ak     (10)

Từ (8) và (9) ta có ngay:

a1 + a2 +... + an-1 > |an - an+1|                            (11)

Từ (10) suy ra với mọi k < n ta có:

an + an+1 > ak - a1 - a2 -...(thiếu k)... - ak           (12)

Từ các bất đẳng thức (11) và (12) suy ra tồn tại một số dương g thỏa mãn đồng thời các điều kiện sau:

an + an+1 > g > |an - an+1|                                (13)

a1 + a2 +... + an-1 > g                                       (14)

g > ak - a1 - a2 -...(thiếu k)... - ak                     (15)

Các bất đẳng thức (13), (14) và (15) chính là điều kiện để tồn tại đa giác n cạnh a1, a2, a3,..., an-1, g và tam giác g, an, an+1. Điều kiện đủ đã được chứng minh.


Chương trình:

Program Dagiac;

Uses Crt;

Const fn = 'P6.INP';

Var i,j,N: integer;

    a: array[1..100] of real;

    s: real;

    Kq: boolean;

{------------------------------------}

Procedure Nhap;

Var f: text;

Begin


 Assign(f,fn); Reset(f);

 Readln(f,N);

 For i:=1 to N do Read(f,a[i]);

 Close(f);

End;

{------------------------------------}



BEGIN

 Nhap;


 Kq:=true;

 For i:=1 to N do

 begin

   s:=0;


   For j:=1 to N do If j<>i then s:=s+a[j];

   If s<=a[i] then Kq:=false;

 end;

 If Kq then Write('Co.') Else Write('Khong.');



 Readln;

END.
Bài 20/2000 - Bạn Lan ở căn hộ số mấy?

(Dành cho học sinh Tiểu học)

Ta coi như các căn hộ được đánh số từ 1 đến 64 (vì ngôi nhà có 8 tầng, mỗi tầng có 8 căn hộ). Ta có thể hỏi như sau:

- Có phải số nhà bạn lớn hơn 32?

Sau khi Lan trả lời, dù "đúng" hay "không" ta cũng biết chính xác căn hộ của Lan ở trong số 32 căn hộ nào. Giả sử câu trả lời là "không" ta cũng biết chính xác căn hộ của Lan ở trong số 32 căn hộ nào. Giả sử câu trả lời là "không", ta hỏi tiếp:

-  Có phải số nhà bạn lớn hơn 16?

Sau câu hỏi này ta biết được 16 căn hộ trong đó có căn hộ Lan đang ở. 

Tiếp tục hỏi như vậy đối với số đứng giữa trong các số còn lại. Sau mỗi câu trả lời khoảng cách giữa các số giảm đi một nửa. Cứ như vậy, chỉ cần 6 câu hỏi, ta sẽ biết được căn hộ Lan ở.
Bài 21/2000 - Những trang sách bị rơi

(Dành cho học sinh Tiểu học)

Nếu trang bị rơi đầu tiên đánh số 387 thì trang cuối cùng sẽ phải đánh số lớn hơn và phải là số chẵn. Do vậy trang cuối cùng phải là 738.

Như vậy, có 738 - 378 + 1= 352 trang sách (176 tờ ) bị   rơi.


Bài 22/2000 - Đếm đường đi

(Dành cho học sinh THCS)

a) Có tất cả 8 đường đi từ A đến B sao cho mỗi đường đi qua một đỉnh nào đó chỉ đúng một lần. Cụ thể:

A B


A E B

A E F B


A E D F B

A E F C B

A E D C B

A E F D C B


A E D F C B


b). Có tất cả 8 đường đi từ A đến D, sao cho đường đi đó qua mội cạnh nào đó chỉ đúng một lần, cụ thể:

A B C D


A B E D

A B F D


A E D

A E B F D

A E B C D

A E F D


A E F C D

c). Các đường đi qua tất cả các cạnh của hình, qua mỗi cạnh đúng một lần (điểm bắt đầu và điểm kết thúc trùng nhau):

-
+ Các đường đi qua tất cả các cạnh của hình, qua mỗi cạnh đúng một lần (điểm bắt đầu và điểm kết thúc không trùng nhau):

- Điểm bắt đầu là C và điểm kết thúc là D:

CFBCDFEBAED

CFBCDFEABED

CDFCBFEBAED

....


Tương tự như thế với điểm bắt đầu là D và điểm kết thúc là C ta cũng tìm được các đường thoả mãn tính chất này.

Bài 23/2000 - Quay Rubic


(Dành cho học sinh THPT)

Khai triển mặt rubic và đánh số các mặt như hình vẽ sau:

Khi đó ta có thể xây dựng thủ tục Quay (mặt thứ i) để đổi màu 8 mặt con của mặt này và 12 mặt con kề với mặt này. Trên cơ sở đó giải được 2 bài toán này. Chương trình có thể viết như sau:

Program Rubic;

uses Crt;

Type  Arr= array[0..5, 0..7] of byte;

const color: Array [0..5] of char=('F', 'U','R', 'B', 'L', 'D');

Var


A1, A2, A0, A: Arr;

        X, X1, X2: String;

        k: byte;

Procedure Nhap;

Var   i, j: byte;

Begin


       Clrscr;

       Writeln ('Bai toan 1. So sanh hai xau:');

       Writeln ('Nhap xau X1:');

       Readln (X1);

       Writeln (' Nhap xau X2:');

       Readln (X2);

       Writeln ('Bai toan 2. Tinh so lan xoay:');

       Write ('Nhap xau X:');

       Readln (X);

      For i:= 0 to 5 do

          For j:= 0 to 7 do A[i, j]:= i; 

       A:=A0; A1:=A0; A2:=A0;

End;

Procedure Quay (Var A: Arr; k: byte);



Const Dir : array

[0.. 5, 0.. 3, 0.. 3] of byte = ( ( (1,2,5,4), (6,0,2,4), (5,7,1,3), (4,6,0,2) ),

( (0,4,3,2), (0,0,4,0), (1,1,5,1), (2,2,6,2) ),

( (0,1,3,5), (4,4,4,4), (3,3,3,3), (2,2,2,2) ),

( (1,4,5,2), (2,0,6,4), (1,7,5,3), (0,6,4,2) ),

( (0,5,3,1), (0,0,0,0), (7,7,7,7),(6,6,6,6) ),

( (0,2,3,4), (6,6,2,6), (5,5,1,5), (4,4,0,4) ) );

var i,j,tg: byte;

Begin

tg:=A[k,6];



for i:=3 downto 1 do A[k,0] := A[k,2*i-2];

A[k,0]:=tg;

tg:=A[k,7];

for i:=3 downto 1 do A[k,2*i] := A[k,2*i -2];

A[k,1]:=tg;

for i:=1 to 3 do

begin

tg:=A[dir[k,0,3], Dir[k,i,3];



for j:=3 downto 1 do A[ dir[k,0,j], Dir[k,i,j] ]:= A[ dir[k,0,j-1], Dir[k,i,j-1] ];

A[ [dir[k,0,0], Dir[k,i,0] ]:=tg;

end;

End;


Function Eq(A,B:Arr):Boolean;

Var i,j,c:byte;

Begin

c:=0;


for i:=1 to 5 do

for j:=1 to 7 do

If A[i,j] <> B[i,j] then inc(c);

If c=0 then Eq:=true else Eq:=false;

End;

Procedure QuayXau(x:string; var A: arr);



Var i,j:byte;

Begin


for i:=1 to length(X) do

begin


for j:= 1 to 5 do

If Color[j] = X[i] then Quay(A,j);

end;

End;


Procedure Bai1;

Begin


QuayXau(X1,A1);

QuayXau(X2,A2);

End;

Procedure Bai2;



Begin

k:=0;


Repeat

QuayXau(X,A);

Inc(k);

Until Eq(A,A0);



End;

Procedure Xuat;

Var i,j:byte;

Begin


writeln;

writeln('Ket qua:');

writeln('Bai toan 1. So sanh 2 xau:') ;

If Eq(A1,A2) then writeln('Hai xau X1 va X2 cho cung mot ket qua.');

writeln('Can ap dung xau X ',k,' lan de Rubic quay ve trang thai ban dau.');

Readln;


End;

Begin


Nhap;

Bai1;


Bai2;

Xuat;


END.



tải về 1.1 Mb.

Chia sẻ với bạn bè của bạn:
1   ...   8   9   10   11   12   13   14   15   ...   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