Tải bản đầy đủ (.doc) (10 trang)

Đề thi và đáp án môn Tin kỳ thi HSG tỉnh Thanh Hóa năm học 2020-2021

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 (128.27 KB, 10 trang )

SỞ GIÁO DỤC VÀ ĐÀO TẠO
THANH HOÁ

KỲ THI HSG CÁC MƠN VĂN HỐ CẤP TỈNH
NĂM HỌC: 2020-2021

ĐỀ CHÍNH THỨC

Mơn thi: Tin học
BẬC HỌC: THPT
Thời gian: 180 phút (không kể thời gian giao đề)
Ngày thi: 15/12/2020
Đề này có 05 câu, gồm 03 trang.

Số báo danh
…………………….

Tổng quan bài thi:
Câu 1
Câu 2
Câu 3
Câu 4
Câu 5

Tên bài
CHIA Q
ĐIỂM ẢNH
XỐ SỐ
TỪ VỰNG
TAM GIÁC


File chương trình
CAU1.*
CAU2.*
CAU3.*
CAU4.*
CAU5.*

File dữ liệu vào
CAU1.INP
CAU2.INP
CAU3.INP
CAU4.INP
CAU5.INP

File kết quả
CAU1.OUT
CAU2.OUT
CAU3.OUT
CAU4.OUT
CAU5.OUT

Dữ liệu vào là đúng đắn, không cần phải kiểm tra. Trong các file dữ liệu vào/ra, nếu dữ liệu trên cùng
một dịng thì được cách nhau bởi ít nhất 1 dấu cách. Dấu (*) trong tên file chương trình biểu thị đi
file tùy thuộc vào NNLT sử dụng ('pas' đối với NNLT PASCAL, ‘c’ đối với NNLT C,...).

CÂU 1 (6 điểm): Chia quà
Trường THPT A chia quà tết cho các học sinh thuộc diện chính sách dịp cuối năm 2020,
có X chiếc áo và Y hộp bánh. Một phương án chia quà của nhà trường là chọn ra N học sinh
được nhận quà sao cho có thể chia hết X chiếc áo và Y hộp bánh, đồng thời mỗi học sinh sẽ
nhận được số lượng chiếc áo bằng nhau và số lượng hộp bánh cũng bằng nhau.

Yêu cầu: Tìm tất cả các phương án chia quà thoả mãn điều kiện nêu trên. Giả sử rằng số học
sinh thuộc diện chính sách của nhà trường là đủ nhiều để có thể thực hiện được tất cả các
phương án chia quà.
Dữ liệu vào: Đọc từ tệp CAU1.INP – gồm 2 số nguyên dương X, Y (X, Y≤ 109).
Dữ liệu ra: Ghi ra tệp CAU1.OUT một số nguyên là số phương án chia q tìm được
Ví dụ:
CAU1.INP
6 18
12 8

CAU1.OUT
4
3

CÂU 2 (5 điểm): Điểm ảnh
Trong máy tính, một bức ảnh có các điểm ảnh, mỗi điểm ảnh được biểu thị bởi một
màu, có thể có những điểm ảnh có màu giống nhau, mỗi màu được quy định bằng một mã
màu, mã màu là một số nguyên dương có giá trị không quá 106.
Yêu cầu: Cho trước một bức ảnh có N điểm ảnh và mã màu của từng điểm ảnh. Hãy cho biết
số lượng điểm ảnh có mã màu giống nhau nhiều nhất.
Dữ liệu vào: Đọc từ tệp CAU2.INP gồm hai dòng:
-

Dòng thứ nhất ghi số nguyên dương N (N≤106)

-

Dòng thứ hai ghi N số nguyên dương a 1, a2, ..., aN với ai là mã màu của điểm ảnh thứ i
(1≤ai≤106; i=1..N).
1



Dữ liệu ra: Ghi ra tệp CAU2.OUT một số nguyên là kết quả tìm được
Ví dụ:
CAU2.INP
8

CAU2.OUT
3

19293119
Câu 3 (4 điểm): Xố số
Cho số tự nhiên N. Bằng cách giữ nguyên hoặc xoá đi một số chữ số liên tiếp của N
(nhưng khơng xố hết) ta nhận được một số mới, nếu số N bị chia thành 2 phần thì số mới
được ghép lại từ hai phần này và giữ nguyên trật tự.
Yêu cầu: Hãy xác định tất cả số cách xoá như trên để số N mới sau khi xoá chia hết cho 3. Lưu
ý là hai vị trí khác nhau sẽ tạo ra hai cách xoá khác nhau. Số N giữ nguyên cũng được coi là
một cách xoá.
Dữ liệu vào: Đọc từ tệp CAU3.INP chứa số nguyên dương N (không quá 105 chữ số)
Dữ liệu ra: Ghi ra tệp CAU3.OUT một số ngun là số cách xố tìm được
Ví dụ:
CAU3.INP
1005
2009

CAU3.OUT
4
3

Giải thích

Các số mới là: 1005, 105, 105, 15
Các số mới là: 009, 09, 9

Giới hạn:
-

Có 50% số test có số các chữ số của N≤300

-

Có 25% số test tiếp theo có số các chữ số của N≤104

-

Có 25% số test cịn lại có số các chữ số của N≤105

Câu 4 (3 điểm): Từ vựng
Muốn cải thiện vốn từ vựng tiếng Anh của mình thơng qua trị chơi nhận diện từ, Qun
tự viết ra một xâu S có độ dài khơng quá 10 6 chỉ gồm các kí tự thường trong bảng chữ cái tiếng
Anh. Từ đó, Qun tìm ra tất cả các từ vựng có trong S. Một từ vựng sẽ thu được bằng cách
ghép một số kí tự liên tiếp lấy từ S, giữ nguyên trật tự của chúng, thoả mãn một trong hai điều
kiện sau:
-

Bắt đầu bằng một nguyên âm (là các chữ cái: a, e, i, o, u) và kết thúc bằng một phụ âm
(là các chữ cái còn lại)

-

Bắt đầu bằng một phụ âm và kết thúc bằng một nguyên âm


Yêu cầu: Hãy giúp Quyên đếm số lượng từ vựng có trong S theo quy tắc trên
Dữ liệu vào: Đọc từ tệp CAU4.INP gồm xâu S khơng q 106 kí tự.
Dữ liệu ra: Ghi ra tệp CAU4.OUT một số ngun là kết quả tìm được.
Ví dụ:
CAU4.INP

CAU4.OUT
2


adceba

9

Giới hạn:
-

Có 1/3 số test có độ dài xâu S khơng q 104

-

Có 2/3 số test cịn lại khơng có ràng buộc gì thêm

Câu 5 (2 điểm): Tam giác
Hiền có N que tính, mỗi que có độ dài là một số nguyên dương và đôi một khác nhau.
Hiền muốn tạo ra các tam giác bằng cách ghép ba que tính với nhau, độ dài mỗi cạnh của tam
giác đúng bằng độ dài của một que tính.
Yêu cầu: Giúp Hiền tính xem có thể tạo được bao nhiêu tam giác nhộn, tam giác vuông và tam
giác tù khác nhau từ các que tính này. Hai tam giác được gọi là khác nhau nếu có ít nhất một

que tính khác nhau.
Dữ liệu vào: Đọc từ tệp CAU5.INP gồm:
 Dòng đầu tiên là số lượng que tính N (3≤ N≤5000).
 Dịng thứ hai gồm N số nguyên dương không lớn hơn 104 là chiều dài của N que tính.
Dữ liệu ra: Ghi ra tệp CAU5.OUT một dòng duy nhất gồm 3 số nguyên lần lượt là số lượng
tam giác nhọn, tam giác vuông và tam giác tù tao được.
Ví dụ:
CAU5.INP
6

CAU5.OUT
2 1 4

2 12 9 10 3 15
Giới hạn:
-

Có 25% số test có 3≤N≤300

-

75% số test cịn lại khơng có ràng buộc gì thêm.
----------------------------- Hết ----------------------------Giám thị coi thi khơng giải thích gì thêm.

3


CHƯƠNG TRÌNH
Câu 1:
Pascal

const fi='cau1.inp';
fo='cau1.out';
var x,y,t,d: int64;
i: longint;
function ucln(a,b: int64): int64;
var tg: int64;
begin
while a mod b <>0 do
begin
tg:= a mod b;
a:= b;
b:= tg;
end;
ucln:= b;
end;
begin
assign(input,fi);
reset(input);
assign(output,fo);
rewrite(output);
readln(x,y);
t:= ucln(x,y);
if trunc(sqrt(t))=sqrt(t) then
d:= -1
else
d:= 0;
for i:= 1 to trunc(sqrt(t)) do
if t mod i =0 then
inc(d,2);
write(d);

close(input);
close(output);
end.

C++

#include <bits/stdc++.h>
using namespace std;
ifstream fi;
ofstream fo;
long long x,y,m,dem,i,j;
int main()
{
fi.open("Cau1.inp");
fi>>x>>y;
fi.close();
dem=0;
m=trunc(sqrt(x));
for (i=1;i<=m;i++)
{
j=x/i;
if (x%i==0 && y%i==0)
dem++;
if (x%j==0 && y%j==0 && i!=j)
dem++;
}
fo.open("Cau1.out");
fo<fo.close();
return 0;

}

4


Câu 2:
Pascal
const fi='CAU2.inp';
fo='CAU2.out';
var
i,j,n,max:longint;
a:array[0..1000001] of longint;
begin
assign(input,fi);
reset(input);
assign(output,fo);
rewrite(output);
readln(input,n);
max:=0;
for i:=1 to n do
begin
read(input,j);
inc(a[j]);
if a[j]>max then
max:=a[j];
end;
write(output,max);
close(input);
close(output);
end.


C++
#include<bits/stdc++.h>
using namespace std;
int i,n,dmax,x;
int d[1000001];
ifstream fi;
ofstream fo;
int main()
{
fi.open("CAU2.INP");
fi>>n;
for (i=1;i<=n;i++)
{
fi>>x;
d[x]++;
}
fi.close();
fo.open("CAU2.OUT");
dmax=d[1];
for (i=2;i<=1000000;i++)
if (d[i]>dmax)
dmax=d[i];
fo<fo.close();
return 0;
}

5



Câu 3:
Pascal

const fi='cau3.inp';
fo='cau3.out';
var n: ansistring;
s: array[0..100011] of longint;
m: array[0..2] of longint;
t: int64;
i,j,k: longint;
begin
assign(input,fi);
reset(input);
assign(output,fo);
rewrite(output);
read(n);
s[0]:= 0;
for i:= 1 to length(n) do
s[i]:= s[i-1]+ord(n[i])-48;
k:= s[length(n)] mod 3;
t:= 0;
for i:= 0 to length(n) do
begin
j:= s[i] mod 3-k;
if j<0 then
j:= j+3;
t:= t+m[j];
inc(m[s[i] mod 3]);
end;

if k<>0 then
dec(t);
write(t);
close(input);
close(output);
end.

C++

#include <bits/stdc++.h>
using namespace std;
ifstream fi;
ofstream fo;
int a[100001],t[100001],d[3];
string s;
int i,n,k,j,kq;
int main()
{
fi.open("CAU3.INP");
getline(fi,s);
fi.close();
n=s.size();
s='0'+s;
for (i=1;i<=n;i++)
{
a[i]=s[i]-48;
t[i]=t[i-1]+a[i];
}
k=t[n]%3;
kq=0;

for (i=0;i<=n;i++)
{
j=t[i]%3-k;
if (j<0)
j=j+3;

6


kq=kq+d[j];
d[t[i]%3]++;
}
if (k>0)
kq--;
fo.open("CAU3.OUT");
fo<fo.close();
return 0;
}

Câu 4:
Pascal
const fi='CAU4.inp';
fo='CAU4.out';
var
i,j,n:longint;
na,pa,dem:qword;
st:ansistring;
begin
assign(input,fi);

reset(input);
assign(output,fo);
rewrite(output);
read(input,st);
for i:=1 to length(st) do
if st[i] in['a','e','u','i','o'] then
inc(na);
pa:=length(st)-na;
write(output,na*pa);
close(input);
close(output);
end.

C++
#include<bits/stdc++.h>
using namespace std;
ifstream fi;
ofstream fo;
string s;
int main()
{
long long d,i,n;
fi.open("CAU4.INP");
getline(fi,s);
fi.close();
n=s.size();
s=' '+s;
d=0;
for(i=1;i<=n;i++)
if(s[i]=='a' || s[i]=='e' || s[i]=='i' || s[i]=='o' || s[i]=='u')

d++;
fo.open("CAU4.OUT");
fo<fo.close();
return 0;
}

7


Câu 5:
PASCAL
const fi='CAU5.INP';
fo='CAU5.OUT';
var f:text;
d:array[1..200000000] of longint;
a:array[1..5000] of longint;
tg,n,i,j:longint;
demtg,demtgvuong,demtgnhon,demtgtu:qword;
//////////////////////////////////////
function OK(a,b,c:longint):boolean;
begin
OK:=a+b>c;
end;
/////////////////////////////////////
function tgnhon(a,b,c:longint):boolean;
begin
tgnhon:=a*a+b*b>c*c;
end;
/////////////////////////////////////

function tgtu(a,b,c:longint):boolean;
begin
tgtu:=a*a+b*bend;
////////////////////////////////////
function demvuong():qword;
var i,j:longint;
kq:qword;
begin
for i:=1 to n-1 do
for j:=i+1 to n do
inc(d[a[i]*a[i]+a[j]*a[j]]);
kq:=0;
for i:=1 to n do
kq:=kq+d[a[i]*a[i]];
demvuong:=kq;
end;
/////////////////////////////////////
function demnhon():qword;
var i,j,d,c:longint;
kq:qword;
begin
kq:=0;
for i:=1 to n-2 do
begin
d:=i+2;
c:=i+2;
for j:=i+1 to n-1 do
begin
while (c<=n) and OK(a[i],a[j],a[c]) do

c:=c+1;
demtg:=demtg+c-j-1;
while (d<=n) and tgnhon(a[i],a[j],a[d]) do
d:=d+1;
if d-1<=c then
kq:=kq+d-j-1;
end;
end;
demnhon:=kq;
end;
/////////////////////////////////////////////////
BEGIN

8


assign(f,fi);
reset(f);
readln(f,n);
for i:=1 to n do
read(f,a[i]);
close(f);
for i:=1 to n-1 do
for j:=i+1 to n do
if a[i]>a[j] then
begin
tg:=a[i];
a[i]:=a[j];
a[j]:=tg;
end;

demtg:=0;
demtgvuong:=demvuong();
demtgnhon:=demnhon();
demtgtu:=demtg-demtgvuong-demtgnhon;
assign(f,fo);
rewrite(f);
write(f,demtgnhon,' ',demtgvuong,' ',demtgtu);
close(f);
END.

C++
#include <bits/stdc++.h>
using namespace std;
ifstream fi;
ofstream fo;
int d[200000001];
long long demtg=0;
int i,n;
int a[5001];
bool OK(int a, int b, int c)
{
return (a+b>c);
}
bool tgnhon(int a, int b, int c)
{
return (a*a+b*b>c*c);
}
long long demvuong()
{
long long kq,i,j;

for (i=1;i<=n-1;i++)
for (j=i+1;j<=n;j++)
d[a[i]*a[i]+a[j]*a[j]]++;;
kq=0;
for (i=1;i<=n;i++)
kq=kq+d[a[i]*a[i]];
return kq;
}

9


long long demnhon()
{
long long kq=0;
int i,j,d,c;
for (i=1;i<=n-2;i++)
{
d=i+2;
c=i+2;
for (j=i+1;j<=n-1;j++)
{
while (c<=n && OK(a[i],a[j],a[c]))
c++;
demtg=demtg+c-j-1;
while (d<=n && tgnhon(a[i],a[j],a[d]))
d++;
if (d-1<=c)
kq=kq+d-j-1;
}

}
return kq;
}
int main()
{
long long nhon,tu,vuong;
fi.open("CAU5.INP");
fi>>n;
for (i=1;i<=n;i++)
fi>>a[i];
fi.close();
sort(a+1,a+1+n);
vuong=demvuong();
nhon=demnhon();
tu=demtg-vuong-nhon;
fo.open("CAU5.OUT");
fo<fo.close();
return 0;
}

Các chương trình trên, có cả chương trình mình lấy của thí sinh được full điểm.
Các bộ test khơng phải là test chấm chính thức mà chỉ là test mình tạo để mọi người tham khảo
Bài 1 code pascal 1 cách, code C++ lại là cách khác nhưng cách nào cũng full điểm.

10




×