Đề thi, hướng dẫn làm các bài trong đề thi và bộ test dùng để chấm điểm. Chỉ cần tải về làm rồi dùng chương trình Themis để chấm bài. Nếu không làm được thì đọc hướng dẫn làm bài và đọc chương trình tôi đã viết (bằng C++ và Pascal) để biết. Cảm ơn
Trang 1SỞ GIÁO DỤC VÀ ĐÀO TẠO
THANH HOÁ
ĐỀ CHÍNH THỨC
KỲ THI HSG CÁC MÔN VĂN HOÁ CẤP TỈNH
NĂM HỌC: 2020-2021
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.
Tổng quan bài thi:
Tên bài File chương trình File dữ liệu vào File kết quả
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ị đuô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 quà tìm được
Ví dụ:
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 a1, a2, , aN với ai là mã màu của điểm ảnh thứ i (1≤ai≤106 i=1 N)
Số báo danh
……….
Trang 2Dữ liệu ra: Ghi ra tệp CAU2.OUT một số nguyên là kết quả tìm được
Ví dụ:
8
1 9 2 9 3 1 1 9
3
Câu 3 (4 điểm): Xoá 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 xoá 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ố nguyên là số cách xoá tìm được
Ví dụ:
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ừ, Quyên
tự viết ra một xâu S có độ dài không quá 106 chỉ gồm các kí tự thường trong bảng chữ cái tiếng Anh Từ đó, Quyên 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)
Trang 3adceba 9
Giới hạn:
- Có 1/3 số test có độ dài xâu S không quá 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ụ:
6
2 12 9 10 3 15
2 1 4
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.
Trang 4CHƯƠ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)
Trang 5Câ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<<dmax;
fo.close();
return 0;
}
Trang 6Câ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;
Trang 7d[t[i]%3]++;
}
if (k>0)
kq ;
fo.open("CAU3.OUT");
fo<<kq;
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
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<<d*(n-d);
fo.close();
return 0;
}
Trang 8Câ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*b<c*c;
end;
////////////////////////////////////
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
Trang 9assign(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;
}
Trang 10long 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<<nhon<<' '<<vuong<<' '<<tu;
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.