Tải bản đầy đủ (.pdf) (31 trang)

Bài giải đề thi tin học trẻ THCS các quận, huyện, thị xã ■ lập trình free pascal ■ tập 3

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.4 MB, 31 trang )

BÀI GIẢI ĐỀ THI TIN HỌC TRẺ CÁC TỈNH, QUẬN, HUYỆN, THỊ XÃ – Tập 3

Đề thi Tin học trẻ tỉnh Kon Tum năm 2015
Khối Trung học Cơ sở
Thời gian làm bài: 150 phút.

Hướng giải quyết:
- Khi cắt lần 1, có thể cắt theo chiều đứng (Đ) hay chiều ngang (N) vì đều chia bánh ra
làm 2 phần, nên chúng ta chọn chiều đứng, vết cắt là Đ1:

- Khi cắt lần 2, nếu cắt theo chiều đứng chúng ta chỉ được 3 phần, trong khi cắt theo
chiều ngang (số phần tối đa được cắt là 2), sẽ chia bánh ra làm 4 phần, nên chúng ta chọn
chiều ngang, vết cắt là N2:

Trang 1

Biên soạn: Th.S Nguyễn Anh Việt


BÀI GIẢI ĐỀ THI TIN HỌC TRẺ CÁC TỈNH, QUẬN, HUYỆN, THỊ XÃ – Tập 3

- Khi cắt lần 3, có thể cắt theo chiều đứng (Đ) hay chiều ngang (N) vì đều chia bánh ra
làm 6 phần (số phần tối đa được cắt là 2), nên chúng ta chọn chiều đứng, vết cắt là Đ3:

- Khi cắt lần 4, nếu cắt theo chiều đứng chúng ta chỉ được 8 phần, trong khi cắt theo
chiều ngang (số phần tối đa được cắt là 3) sẽ chia bánh ra làm 9 phần, nên chúng ta chọn
chiều ngang, vết cắt là N4:

Từ đây, chúng ta thấy rằng muốn cắt bánh để được số phần nhiều nhất phải theo qui luật
sau đây:
Trang 2



Biên soạn: Th.S Nguyễn Anh Việt


BÀI GIẢI ĐỀ THI TIN HỌC TRẺ CÁC TỈNH, QUẬN, HUYỆN, THỊ XÃ – Tập 3

- Từ đây chúng ta thấy có qui luật: Nếu số lần cắt k là số chẵn (2, 4, 6, 8), số phần tối đa
sau khi cắt sẽ là số phần tối đa theo mỗi chiều bình phương (22=4, 32=9, 42=16, 52=25);
nếu số lần cắt k là số lẻ (1, 3, 5, 7), số phần tối đa sau khi cắt sẽ là số phần tối đa theo mỗi
chiều x (số phần tối đa theo mỗi chiều – 1) (2x1=2, 3x2=6, 4x3=12, 5x4=20)
- Ngoài ra, chúng ta có thể thấy rằng nếu k là số chẵn (2, 4, 6, 8), số phần tối đa theo 2
chiều sẽ là (k+2)/2: thí dụ như (2+2)/2=4, (4+2)/2=3, (6+2)/2=4, (8+2)/2=5. Nếu k là số
lẻ (1, 3, 5, 7), số phần tối đa theo 2 chiều sẽ là (k+3)/2: thí dụ như (1+3)/2=2, (3+3)/2=3,
(5+3)/2=4, (7+3)/2=5.
Cuối cùng chúng ta tìm được cơng thức cho kết quả:
n chẵn:

((n+2)/2)2

n lẻ:

((n+3)/2) * ((n+3)/2-1)

Lập trình như sau:
Var k: QWord;
Begin
Assign(Input, 'CatBanh.Inp');
Reset(Input);
ReadLn(k);
Close(Input);

Assign(Output, 'CatBanh.Out');
ReWrite(Output);
If k mod 2=0 then Write(SQR((k+2) div 2)) // Số lần cắt là số chẵn
else Write(((k+3) div 2)*((k+3) div 2-1)); // Số lần cắt là số lẻ
Close(Output);
End.

Trang 3

Biên soạn: Th.S Nguyễn Anh Việt


BÀI GIẢI ĐỀ THI TIN HỌC TRẺ CÁC TỈNH, QUẬN, HUYỆN, THỊ XÃ – Tập 3

Hướng giải quyết:

- Do giới hạn của a[i] là 108 nên chúng ta phải dùng sàng nguyên tố Eratosthen để giải
quyết bài toán. TD: Với Input như trên thì số lớn nhất của dãy số là SLN_DaySo=17:
Dùng mảng SNT[1..SLN_DaySo] để đánh dấu các số nguyên tố. Đầu tiên cho
toàn bộ mảng bằng 1, riêng SNT[1]=0 vì 1 khơng là số ngun tố
Chạy vịng for i từ 2 đến căn bậc 2 của 17 (cắt bỏ số lẻ là 4), nếu SNT[i]=1 thì
đánh dấu các bội số của i là 0 ta thu được kết quả:
i
2
3
4

Bội của i, đánh dấu 0
4, 6, 8, 10, 12, 14, 16
6, 9, 12, 15

4, 8, 12, 16

Ghi chú
Các số này không là số nguyên tố
Các số 6, 12 đã được đánh dấu 0 từ i=2
Các số 4, 8, 12, 16 đã được đánh dấu 0

Cuối cùng, chỉ còn lại các số nguyên tố được đánh dấu 1 là 2, 3, 5, 7, 11, 13 và 17
Như vậy, nếu SNT[i]=1 thì i là số nguyên tố, ngược lại i không là số nguyên tố
- Cách tìm ước số chung lớn nhất của 2 số, Thí dụ : a=12 và b=18
a = a mod b = 12 mod 18 = 12, giữ nguyên b=18
Đổi giá trị a và b => a =18, b=12
a = a mod b = 18 mod 12 = 6, giữ nguyên b=12
Đổi giá trị a và b => a=12, b=6
a = a mod b = 12 mod 6 = 0, giữ nguyên b=6
Đổi giá trị a và b => a=6, b=0
Đến khi b=0 thì ngưng, kết quả chính là a=6
- Sau khi đọc vào dãy số, dùng 2 vòng for i:=1 to n-1 và for j:=i+1 to n để xét tất cả các
cặp số a[i] và a[j], nếu USCLN của a[i] và a[j] là số nguyên tố (SNT[USCLN(a[i],
a[j])]=1) thì tăng biến đếm

Trang 4

Biên soạn: Th.S Nguyễn Anh Việt


BÀI GIẢI ĐỀ THI TIN HỌC TRẺ CÁC TỈNH, QUẬN, HUYỆN, THỊ XÃ – Tập 3

Lập trình như sau:
{$M 11000000} // Tăng cường bộ nhớ

Var n, i, j, Dem, SLN_DaySo: LongInt;
SNT :array [1..10000000] of byte; // i là số nguyên tố thì SNT[i]=1
a :array [1..107] of byte; // n<=100, nên khai báo dư một chút
{--------------------------------------------------------------------}
Function USCLN(a, b: LongInt): LongInt;
Var Tmp :LongInt;
Begin
While b>0 do begin
a:=a mod b;
tmp:=a; a:=b; b:=tmp; // Đổi giá trị a và b
end;
Exit(a);
End;
{--------------------------------------------------------------------}
Procedure Eratosthene(N:longint);
Var
i,j :LongInt;
Begin
Fillchar(SNT,sizeof(SNT),1); SNT[1]:=0;
For i:=2 to Trunc(SQRT(N)) do
If SNT[i]=1 then begin // Tìm các bội số của i<=N và gán là 0
j:=i*i;
While j<=N do begin
SNT[j]:=0;
j:=j+i;
End;
End;
End;
{====================================================================}
Begin

Assign(Input, 'NTo.Inp'); Reset(Input);
ReadLn(n);
SLN_DaySo:=0;
For i:=1 to n do Begin
Read(a[i]);
If SLN_DaySoEnd;
Close(Input);
Eratosthene(SLN_DaySo);
For i:=1 to n-1 do
For j:=i+1 to n do
If SNT[USCLN(a[i], a[j])]=1 then Inc(Dem);
Assign(Output, 'NTo.Out'); ReWrite(Output);
WriteLn(Dem);
Close(Output);
End.

Trang 5

Biên soạn: Th.S Nguyễn Anh Việt


BÀI GIẢI ĐỀ THI TIN HỌC TRẺ CÁC TỈNH, QUẬN, HUYỆN, THỊ XÃ – Tập 3

Hướng giải quyết:
- Xét dãy số trung bình 1 2 2 3 4, vì số 1 là trung bình cộng của chính nó (a[1]/1) nên dãy
số a sẽ có a[1]/1=b[1], tức là a[1]=b[1]
- Số thứ 2 là b[2]=(a[1]+a[2])/2 => a[1]+a[2]=2 x b[2] = 4
=> a[2] = 2*b[2] - a[1] = a[2] = 2*b[2] - b[1]
- Số thứ 3 là b[3]=(a[1]+a[2]+a[3])/3 => a[1]+a[2]+a[3]=3*b[3]

=> a[3] = 3*b[3] – (a[1]+a[2]) , mà (a[1]+a[2])/2=b[2] nên a[1]+a[2]=2*b[2]
=> a[3] = 3*b[3] – 2*b[2]
- Số thứ 4 là b[4]=(a[1]+a[2]+a[3]+a[4])/4 => a[1]+a[2]+a[3]+a[4]=4*b[4]
=> a[4] = 4*b[4] – (a[1]+a[2]+a[3]) ,
mà (a[1]+a[2]+a[3])/3=b[3] nên a[1]+a[2]+a[3]=3*b[3]
=> a[4] = 4*b[4] – 3*b[3]
- Vậy số thứ i sẽ là a[i] = i*b[i] – (i-1)*b[i-1]
- Tóm lại ta có: a[1]=b[1], a[i] = i*b[i] – (i-1)*b[i-1] với i=2 đến n

Lập trình như sau:
{$M 11000000}
Var n, i: LongInt; // n<= 105
a, b :array [1..100007] of LongInt; // a[i] <= 109
Begin
Assign(Input, 'SumAvr.Inp'); Reset(Input);
ReadLn(n);
For i:=1 to n do Read(b[i]);
Close(Input);
a[1]:=b[1];
For i:=2 to n do a[i]:=i*b[i] - (i-1)*b[i-1];

Trang 6

Biên soạn: Th.S Nguyễn Anh Việt


BÀI GIẢI ĐỀ THI TIN HỌC TRẺ CÁC TỈNH, QUẬN, HUYỆN, THỊ XÃ – Tập 3
Assign(Output, 'SumAvr.Out'); ReWrite(Output);
For i:=1 to n do Write(a[i], ' ');
Close(Output);

End.

Hướng giải quyết:
- Số bút chì cần mua là 36, mua 5 tặng 1 sẽ nhận được 6. Lấy 36/6=6 lần mua, nhưng
thực tế chỉ cần mua 5 chiếc bút chì mỗi lần với giá là 5 nên số tiền cần trả là 6*5*5=150
- Trường hợp số bút chì cần mua khơng chia hết cho 6, thí dụ như 38 thì số lần mua được
ưu đãi là 38 div 6 = 6 lần và số bút chì mua khơng được tặng thêm là 38 mod 6 = 2. Số
tiền cần trả là 6*5*5 + 5*2 = 150 + 10 = 160
- Vậy với n là số bút chì cần mua, k là số bút chì mua sẽ được tặng thêm 1 và p là giá mỗi
chiếc bút, chúng ta có cơng thức:
Số tiền trả = n div (k+1) * p * k + (n mod (k+1)) * p
= p * ( (n div(k+1) * k) + n mod (k+1) )
= 5 * (6*5 + 2) = 160

Lập trình như sau:
{$M 11000000}
Var n, k, p: QWord; // n, k, p <= 109
Begin
Assign(Input, 'SALE.Inp'); Reset(Input);
ReadLn(n , k, p);
Assign(Output, 'SALE.Out'); ReWrite(Output);
Write( p * ( n div (k+1) * k + n mod (k+1) ) );
Close(Output);
End.

Trang 7

Biên soạn: Th.S Nguyễn Anh Việt



BÀI GIẢI ĐỀ THI TIN HỌC TRẺ CÁC TỈNH, QUẬN, HUYỆN, THỊ XÃ – Tập 3

Đề thi Tin học trẻ tỉnh Trà Vinh năm 2018
Khối Trung học Cơ sở
Thời gian làm bài: 120 phút.

Hướng giải quyết:
- Trường hợp n=15:
Xét số xuất phát là 15 div 2 = 7 => 7+8=15 => ngưng (Cách 1)
Giảm số xuất phát 1 là 6 => 6+7=13, 6+7+8=21 > 15 => ngưng
Giảm số xuất phát 1 là 5 => 5+6=11, 5+6+7= 18 => ngưng
Giảm số xuất phát 1 là 4 => 4+5=9, 4+5+6=15 => ngưng (Cách 2)
Giảm số xuất phát 1 là 3 => 3+4=7, 3+4+5=12, 3+4+5+6=18 => ngưng
Giảm số xuất phát 1 là 2 => 2+3=5, …, 2+3+4+5=14, 2+3+4+5+6=20 =>
ngưng
Giảm số xuất phát 1 là 1 => 1+2=3, …, 1+2+3+4+5=15 => ngưng (Cách 3)
- Tóm lại, dùng vịng For i:=n div 2 downto 1, cộng dồn các số j từ i, i+1, i+2, … vào
biến tổng (Tong) trong khi Tongtổng các số nguyên liên tiếp
Trang 8

Biên soạn: Th.S Nguyễn Anh Việt


BÀI GIẢI ĐỀ THI TIN HỌC TRẺ CÁC TỈNH, QUẬN, HUYỆN, THỊ XÃ – Tập 3

Lập trình như sau:
Var n, i, j, k, Tong, Dem:integer;
Begin
Write('Nhap n: ');

Readln(n);
Dem:=1;
For i:=n div 2 downto 1 do Begin
Tong:=0;
j:=i;
While TongTong:=Tong+j;
j:=j+1;
End;
If Tong=n then Begin
Write('Cach ', Dem, ': ');
For k:=i to j-1 do Write(k, ' ');
Inc(Dem);
WriteLn;
End;
End;
If Dem=1 then Writeln('Khong the bieu dien');
ReadLn;
End.

Trang 9

Biên soạn: Th.S Nguyễn Anh Việt


BÀI GIẢI ĐỀ THI TIN HỌC TRẺ CÁC TỈNH, QUẬN, HUYỆN, THỊ XÃ – Tập 3

Hướng giải quyết:
- Dùng 2 vịng For i:=1 to n-1 (để có số phía sau) và For j:=i+1 to n để duyệt qua tất cả
các cặp số a[i] và a[j]. Nếu a[i]+a[j]=k thì xuất ra kết quả là vị trí I và j.


Lập trình như sau:
Var a: array[1..100] of integer;
n, k, i, j: Integer; Co_KQ: Boolean;
Begin
Assign(Input,'Sum.Inp');
Reset(Input);
ReadLn(n, k);
For i:=1 to n do Read(a[i]);
Close(Input);
Co_KQ:=False; // Cần chạy trước đoạn này để biết có kết quả hay khơng
For i:=1 to n-1 do
For j:=i+1 to n do
If a[i]+a[j]=k then Begin
Co_KQ:=True; Break;
End;
Assign(Output,'Sum.Out');
ReWrite(Output);
If Co_KQ then Begin // Nếu có, xuất các kết quả
WriteLn('Vi tri 2 goi co tong bang ',k);
For i:=1 to n-1 do
For j:=i+1 to n do
If a[i]+a[j]=k then WriteLn(i,' va ',j);
End
Else Write(0);
Close(Output);
End.

Trang 10


Biên soạn: Th.S Nguyễn Anh Việt


BÀI GIẢI ĐỀ THI TIN HỌC TRẺ CÁC TỈNH, QUẬN, HUYỆN, THỊ XÃ – Tập 3

Hướng giải quyết:
- Sử dụng hàm Copy(Chuổi, vị trí, số ký tự), TD: Copy(‘ABCD’, 2, 3)=’BCD’
- Viết hàm Xoay(Chuổi Ch, vị trí VT), thí dụ như chuổi ABCD:
Nếu VT=1, kết quả là chuổi ABCD => Copy(Ch,1,4)+ Copy(Ch,1,0)
Nếu VT=2, kết quả là chuổi BCDA => Copy(Ch,2,3)+ Copy(Ch,1,1)
Nếu VT=3, kết quả là chuổi CDAB => Copy(Ch,3,2)+ Copy(Ch,1,2)
Nếu VT=4, kết quả là chuổi DABC => Copy(Ch,4,1)+ Copy(Ch,1,3)
Do đó, kết quả của hàm là Ch_KQ=Copy(Ch,VT,Length(Ch)+1-VT)+ Copy(Ch,1,VT-1)
- Viết hàm Palin(Chuổi Ch) trả về True nếu Ch là chuổi Palindrom hay False nếu ngược
lại, TD: Ch=’ABCBA’, ký tự 1 sẽ được so sánh với ký tự 5 (đều là A), ký tự 2 so sánh
với ký tự 4 (đều là B). Số lần so sánh là Length(Ch) div 2=2. Ký tự thứ i sẽ được so sánh
với ký tự thứ Length(Ch)+1-i. Chỉ cần có một sự khác nhau thì hàm trả về False.

Lập trình như sau:
Var Ch: String;
i: Integer; Co_KQ: Boolean;
{--------------------------------------------------------------------}

Trang 11

Biên soạn: Th.S Nguyễn Anh Việt


BÀI GIẢI ĐỀ THI TIN HỌC TRẺ CÁC TỈNH, QUẬN, HUYỆN, THỊ XÃ – Tập 3
Function Xoay(Ch: String; VT: Integer): String;

Var Ch_KQ: String; i: Integer;
Begin
Ch_KQ:=Copy(Ch,VT, Length(Ch)-VT+1);
Ch_KQ:=Ch_KQ+Copy(Ch,1,VT-1);
Exit(Ch_KQ); Exit(Ch_KQ);
End;
{--------------------------------------------------------------------}
Function Palin(Ch: String): Boolean;
Var i: Integer;
Begin
For i:=1 to Length(Ch) div 2 do
If Ch[i] <> Ch[Length(Ch)+1-i] then Exit(False);
Exit(True);
End;
{====================================================================}
Begin
Assign(Input,'Palin.Inp');
Reset(Input);
ReadLn(Ch);
Close(Input);
Co_KQ:=False; // Cần chạy trước đoạn này để biết có kết quả hay khơng
For i:=1 to Length(Ch) do
If Palin(Xoay(Ch, i)) then Begin
Co_KQ:=True; Break;
End;
Assign(Output,'Palin.Out');
ReWrite(Output);
If Co_KQ then // Có kết quả, xuất giá trị 1
Write(1)
Else

Write(0);
Close(Output);
End.

Trang 12

Biên soạn: Th.S Nguyễn Anh Việt


BÀI GIẢI ĐỀ THI TIN HỌC TRẺ CÁC TỈNH, QUẬN, HUYỆN, THỊ XÃ – Tập 3

Đề thi Tin học trẻ tỉnh An Giang năm 2021
Khối Trung học Cơ sở
Thời gian làm bài: 150 phút.

Trang 13

Biên soạn: Th.S Nguyễn Anh Việt


BÀI GIẢI ĐỀ THI TIN HỌC TRẺ CÁC TỈNH, QUẬN, HUYỆN, THỊ XÃ – Tập 3

Hướng giải quyết:
- Việc đọc dữ liệu input khó hơn bình thường, cần phải phân tích:
n=5
7
3
8
2
4


8
1
7
5

0
4
2

4
6

Mảng a[]
11
21 22
31 32 33
41 42 43 44
51 52 53 54 55

5

Dòng 1 đọc 1 số, dòng 2 đọc 2 số, …, dịng n đọc n số => lập trình như sau:
For i:=1 to n do
For j:=1 to i do
Read(a[i, j]);
- Do chỉ có thể đi xuống trái và xuống phải, nên mỗi phần tử chỉ có thể được đi từ trên
trái hoặc trên phải:

- Lập bảng qui hoạch động Q để tìm giá trị lớn nhất khi đi từ đỉnh của tam giác như sau:

Q[1,1]=a[1,1]
Q[d,c]=Max(Q[d-1,c-1], Q[d-1,c]) + a[d,c] với dòng d = 2..n và cột c-1 hay c
phải thỏa điều kiện >=1 và <= d vì dịng d chỉ có d cột.
Chúng ta có bảng Q như sau:
7
3
8
2
4

8
1

7
5

7
10
0
4

2

18
4

6

20
5


24

15
16

25
30

15
20

27

19
26

24

- Truy vết tìm đường đi
Xác định vị trí của Max dịng 5: [5,2] => VT_Cot_Max=2

Trang 14

Biên soạn: Th.S Nguyễn Anh Việt


BÀI GIẢI ĐỀ THI TIN HỌC TRẺ CÁC TỈNH, QUẬN, HUYỆN, THỊ XÃ – Tập 3
Cho biến dòng d=n (5), biến cột c=VT_Cot_Max (2)
Tìm vị trí của số lớn nhất trong 2 số Q[d-1, c-1] và Q[d-1, c] (20 và 25) và xác

định vị trí, chúng ta được kết quả:
7
8

3
1

8
2
4

2

15

10
0

4

7
5

7

4
6

16


18
20
5

24

20

25
30

15

27

19
26

24

Lập trình như sau:
Var
n, d, c, Max, VT_Cot_Max: Integer;
a, Q: Array [0..1005, 0..1005] of Integer;
Ch, Chuoi_KQ: String;
{--------------------------------------------------------------------}
Procedure QHD; // Quy hoạch động
Begin
Q[1,1]:=a[1,1];
For d:=2 to n do

For c:=1 to d do Begin
Max:=Q[d-1,c-1];
// Max của Ô trên, trái
If MaxQ[d,c]:=Max+a[d,c];
// cộng với a[d,c] hiện tại
End;
End;
{--------------------------------------------------------------------}
Procedure TruyVet;
Begin
Max:=Q[n,1]; VT_Cot_Max:=1;
For c:=1 to d do
If MaxMax:=Q[n,c];
VT_Cot_Max:=c;
End;
c:=VT_Cot_Max;
While d>=1 do Begin
Str(a[d,c], Ch);
Chuoi_KQ:=Ch + ' ' + Chuoi_KQ;
If Q[d-1,c-1]>Q[d-1,c] then Dec(c); // Nếu ô trên, trái lớn:giảm cột
Dec(d);
End;
End;
{====================================================================}
Begin
Assign(Input, 'Bai01.Inp');
Reset(Input);


Trang 15

Biên soạn: Th.S Nguyễn Anh Việt


BÀI GIẢI ĐỀ THI TIN HỌC TRẺ CÁC TỈNH, QUẬN, HUYỆN, THỊ XÃ – Tập 3
ReadLn(n);
For d:=1 to n do
For c:=1 to d do
Read(a[d, c]);
Close(Input);
QHD;
TruyVet;
Assign(Output, 'Bai01.Out');
ReWrite(Output);
WriteLn(Max);
WriteLn(Chuoi_KQ);
Close(Output);
End.

Hướng giải quyết:
- Sử dụng mảng Chon[] để chọn các số từ dãy số 4 2 5 1 6 8 3, TD: Khi Chon={1, 0, 1, 0,
1, 1, 1} tương ứng với các số 4+2+5+6+8+3 = 26
- Mỗi vị trí VT sẽ có giá trị là 0 hay 1, xuất phát từ vị trí 1 (Try(1)) và kết thúc khi vị trí
bằng n (If VT=n then _Print) là đã chọn được một bộ các số. Nếu tổng của nó bằng S=26
thì in kết quả.
- Khi Chon[VT]=1 thì số a[VT] được chọn, tổng sẽ cộng vào a[VT]
(Tong:=Tong+Chon[VT]*a[VT]). Gọi đệ quy Try(VT+1) để thử VT kế tiếp. Khi quay lại
thì trừ giá trị a[VT] ra khỏi tổng (Tong:=Tong-Chon[VT]*a[VT])
- Trong q trình chọn tiếp tục các vị trí kế tiếp, nếu tổng vẫn còn <= S (Tong <= S) thì

mới thử vị trí kế tiếp để loại bỏ các nhánh khơng có kết quả nếu đi tiếp các vị trí phía sau,
giúp cho chương trình chạy nhanh hơn (If Tong <= S then Try(VT+1)).
Trang 16

Biên soạn: Th.S Nguyễn Anh Việt


BÀI GIẢI ĐỀ THI TIN HỌC TRẺ CÁC TỈNH, QUẬN, HUYỆN, THỊ XÃ – Tập 3

Lập trình như sau:
Var n, i, S, Tong: Integer; Co_KQ: Boolean;
a, Chon: Array [1..33] of Integer;
{--------------------------------------------------------------------}
Procedure _Print;
Var i: Integer;
Begin
If Tong=S then Begin // In ra các dãy số có tổng = S tại các vị trì
Co_KQ:=True;

// đã chọn (Chon[i]=1)

For i:=1 to n do
If Chon[i]=1 then Write(a[i], ' ');
WriteLn;
End;
End;
{--------------------------------------------------------------------}
Procedure Try(VT: Integer); // Thử tại ví trí VT
Var j: Integer;
Begin

For j:=0 to 1 do Begin
Chon[VT]:=j;
Tong:=Tong+a[VT]*Chon[VT];

// Nếu chọn, cộng a[VT] vào tổng

If VT=n then _Print
else If Tong<=S then Try(VT+1); // Thử ví trí kế VT+1 nếu tổng<=S
Tong:=Tong-a[VT]*Chon[VT];

// Trừ ra a[VT] nếu trước đó có chọn

End;
End;
{====================================================================}
Begin
Assign(Input, 'Bai02.Inp');
Reset(Input);
ReadLn(n, S);
For i:=1 to n do Read(a[i]);
Close(Input);

Trang 17

Biên soạn: Th.S Nguyễn Anh Việt


BÀI GIẢI ĐỀ THI TIN HỌC TRẺ CÁC TỈNH, QUẬN, HUYỆN, THỊ XÃ – Tập 3
Assign(Output, 'Bai02.Out');
ReWrite(Output);

Try(1);
If not Co_KQ then Write('khong co day con co tong bang ', S);
Close(Output);
End.

Trang 18

Biên soạn: Th.S Nguyễn Anh Việt


BÀI GIẢI ĐỀ THI TIN HỌC TRẺ CÁC TỈNH, QUẬN, HUYỆN, THỊ XÃ – Tập 3

Đề thi Tin học trẻ TP. Vinh 2019
Khối Trung học Cơ sở
Thời gian làm bài: 150 phút

Hướng giải quyết:
- Trong quá trình đọc file input ktra.inp, nếu đếm số phần tử bằng 0 vượt quá phân nửa
số phần tử của ma trận (=số dòng x số cột) => ma trận thưa hoặc số phần tử khác 0
bằng phân nửa số phần tử => không phải ma trận thưa thì ngưng đọc và kết luận tính
chất của ma trận

Lập trình như sau:
Var
sd, sc, d, c, Dem_0, Dem_khac_0: Integer;
a: Array [1..2000, 1..2000] of Integer;

Trang 19

Biên soạn: Th.S Nguyễn Anh Việt



BÀI GIẢI ĐỀ THI TIN HỌC TRẺ CÁC TỈNH, QUẬN, HUYỆN, THỊ XÃ – Tập 3
Begin
Assign(Input, 'ktra.inp');
Reset(Input);
ReadLn(sd, sc);
For d:=1 to sd do
For c:=1 to sc do Begin
Read(a[d, c]);
If a[d, c]=0 then Inc(Dem_0)
else Inc(Dem_khac_0);
If (Dem_0>(sd*sc) / 2) or (Dem_khac_0>=(sd*sc) / 2) then Break;
End;
Close(Input);

// Nếu số phần tử (PT) 0 vượt hơn nửa số phần tử của
// ma trận hay số PT <> 0 >= số PT => ngưng

Assign(Output, 'ktra.out');
ReWrite(Output);
If Dem_0>(sd*sc) / 2 then Write('Dung la ma tran thua')
else Write('Sai, khong la ma tran thua');
Close(Output);
End.

Trang 20

Biên soạn: Th.S Nguyễn Anh Việt



BÀI GIẢI ĐỀ THI TIN HỌC TRẺ CÁC TỈNH, QUẬN, HUYỆN, THỊ XÃ – Tập 3

Hướng giải quyết:
- Đầu tiên, đọc file Input2.Int để lấy ra các từ gốc vào mảng Goc[] và các từ thay thế vào
mảng The[]:
Dùng hàm Pos() để tìm vị trí của khoảng trắng ‘_‘ trong chuổi ‘ban_em’ =>
Pos=4
Từ gốc sẽ là chuổi con lấy từ vị trí 1 đến Pos()-1=3 => ‘ban’
Từ thay thế là chuổi con lấy từ vị trí Pos()+1=5 với độ dài là Length(‘ban_em’)
- Pos() = 6-4=2 => ‘em’
Biếm đếm (Dem) sẽ cho biết số từ cần thay thế (có 2 từ là ‘ban’ và ‘cao’)
- Tiếp tục đọc từng dòng của file Input1.int vào biến string Ch, dùng vòng For i chạy từ 1
đến Dem, nếu hàm Pos(Goc[i], Ch)>0 nghĩa là có từ Goc[i] trong dịng này, TD:
Ch=’chao cac ban’, Goc[1]=’ban’, => Pos()=10
Xóa Chuổi Ch tại vị trí Pos()=10, số ký tự cần xóa là Length(Goc[i])=3 =>
‘chao cac ‘
Chen chuổi thay thế The[i]=’em’ vào chuổi Ch tại vị trí Pos => ‘chao cac em’

Lập trình như sau:
Trang 21

Biên soạn: Th.S Nguyễn Anh Việt


BÀI GIẢI ĐỀ THI TIN HỌC TRẺ CÁC TỈNH, QUẬN, HUYỆN, THỊ XÃ – Tập 3
Var
Ch, Ch_Goc, Ch_The: String;
Goc, The: Array [1..55] of String;
Dem, VT, i: Integer;

Begin
Assign(Input, 'Input2.int');
Reset(Input);
Dem:=0;
While not EOF() do Begin // Đọc các cặp từ tìm và thay thế
ReadLn(Ch);
Inc(Dem);
Ch_Goc:=Copy(Ch,1,Pos(' ', Ch)-1); // Tách từ ‘bạn_em’
Ch_The:=Copy(Ch,Pos(' ', Ch)+1, Length(Ch)-Pos(' ', Ch));
Goc[Dem]:=Ch_Goc;
The[Dem]:=Ch_The;
End;
Close(Input);
Assign(Input, 'Input1.int');
Reset(Input);
Assign(Output, 'KQ.out');
ReWrite(Output);
While not EOF() do Begin
ReadLn(Ch); // Đọc mỗi dòng
For i:=1 to Dem do
If Pos(Goc[i], Ch)>0 then Begin
VT:=Pos(Goc[i], Ch); // Tìm vị trí từ ‘bạn’
Delete(Ch, VT, Length(Goc[i])); // Xóa từ ‘bạn’
Insert(The[i], Ch,

VT); // Chen vào từ ‘em’

End;
WriteLn(Ch);
End;

Close(Input);
Close(Output);
End.

Trang 22

Biên soạn: Th.S Nguyễn Anh Việt


BÀI GIẢI ĐỀ THI TIN HỌC TRẺ CÁC TỈNH, QUẬN, HUYỆN, THỊ XÃ – Tập 3

Hướng giải quyết:
- Đầu tiên, viết Function NT(n: Integer): Boolean để xét số nguyên tố
- Chỉ cần dùng 2 vòng For x:=2 to n (do 2 là số nguyên tố nhỏ nhất) và For y:=x to n (do
y>=x) để tìm bộ 3 số nguyên tố, vì tổng của 3 số là n nên số thứ ba sẽ là n-x-y và n-xy>=y để tránh lặp lại các kết quả. Nếu x và y và n-x-y là nguyên tố thì xuất kết quả

Lập trình như sau:
Var
n, x, y: Integer;
{--------------------------------------------------------------------}
Function NT(n: Integer): Boolean;
Var i: Integer;
Begin
If n<2 then Exit(False); // Các số <2 không là số nguyên tố
For i:=2 to Trunc(SQRT(n)) do // Thử xem n có chia hết 2..căn(n)
If n mod i=0 then Exit(False); // Chia hết -> không là nguyên tố
Exit(True); // Không chia hết cho số nào -> nguyên tố
End;
{====================================================================}
Begin

Assign(Input, 'TimNghiem.int');
Reset(Input);
Read(n);
Close(Input);
Assign(Output, 'TimNghiem.Out');
ReWrite(Output);
For x:=2 to n do
For y:=x to n do
If NT(x) and NT(y) and NT(n-x-y) and (n-x-y>=y) then
WriteLn(x, ' ', y, ' ', n-x-y);
WriteLn('0 0 0';
Close(Output);
End.

Trang 23

Biên soạn: Th.S Nguyễn Anh Việt


BÀI GIẢI ĐỀ THI TIN HỌC TRẺ CÁC TỈNH, QUẬN, HUYỆN, THỊ XÃ – Tập 3

Đề thi Tin học trẻ TP. Vị Thanh 2019
Khối Trung học Cơ sở
Thời gian làm bài: 150 phút

Hướng giải quyết:
- Đầu tiên, sắp thứ tự 3 số a1, a2, a3 tăng dần:
Nếu a1>a2: t=a1, a1=a2; a2=t;
Nếu a1>a3: t=a1, a1=a3; a3=t;
Nếu a2>a3: t=a2, a2=a3; a3=t;

Trang 24

Biên soạn: Th.S Nguyễn Anh Việt


BÀI GIẢI ĐỀ THI TIN HỌC TRẺ CÁC TỈNH, QUẬN, HUYỆN, THỊ XÃ – Tập 3
- Chúng ta thu được kết quả: a1=123, a2=234, a3=345
- Chuyển 3 giá trị thành chuổi Ch1=’123’, Ch2=’234’, Ch3=’345’
- Kết quả dãy không giảm sẽ là Ch1+Ch2, Ch1+Ch3, Ch2+Ch1, Ch2+Ch3, Ch3+Ch1,
Ch3+Ch2 lần lượt là: ‘123234’, ‘123345’, 234123’, ‘234345’, ‘345123’, ‘345234’

Lập trình như sau:
Var
a1, a2, a3, t: LongInt;
Ch1, Ch2, Ch3: String;
Begin
WriteLn('Nhap a1');
ReadLn(a1);
WriteLn('Nhap a2');
ReadLn(a2);
WriteLn('Nhap a3');
ReadLn(a3);
If a1>a2 then Begin t:=a1; a1:=a2; a2:=t; End; // Sắp thứ tự tăng
If a1>a3 then Begin t:=a1; a1:=a3; a3:=t; End;
If a2>a3 then Begin t:=a2; a2:=a3; a3:=t; End;
Str(a1, Ch1); // Đổi số thành chuổi
Str(a2, Ch2);
Str(a3, Ch3);
WriteLn(Ch1+Ch2,' ',Ch1+Ch3,' ',Ch2+Ch1,' ',Ch2+Ch3,' ',Ch3+Ch1,' ',
Ch3+Ch2);

// ReadLn;
End.

Trang 25

Biên soạn: Th.S Nguyễn Anh Việt


×