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

Đề thi khảo sát đội tuyển HSG lớp 12 môn tin học

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

SỞ GD&ĐT
ĐỀ THI KHẢO SÁT

ĐỀ THI KHẢO SÁT CHẤT LƯỢNG ĐỘI TUYỂN
HỌC SINH GIỎI CẤP TỈNH LỚP 12
Môn thi: Tin học
Thời gian làm bài: 180 phút

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ả
Bài 1 CẮT CHỮ VI TÍNH
BAI1.*
BAI1.INP
BAI1.OUT
Bài 2 NGÔN NGỮ MUMBA
BAI2.*
BAI2.INP
BAI2.OUT
Bài 3 CẶP ĐÔI HOÀN HẢO
BAI3.*
BAI3.INP
BAI3.OUT
Bài 4 TÍNH TỔNG
BAI4.*
BAI4.INP
BAI4.OUT
Bài 5 ĐẾM DÃY CHIA HẾT
BAI5.*


BAI5.INP
BAI5.OUT
Dữ liệu vào là đúng đắn, không cần phải kiểm tra. Các số trên một dòng ghi cách nhau một dấu cách.
Hãy lập trình giải các bài toán sau:
Bài 1. CẮT CHỮ VI TÍNH
Trong kỳ thi học sinh giỏi toàn tỉnh năm 2018, ban tổ chức có ý định in vi tính số báo danh của từng
thí sinh, sau đó dán lên từng bàn vi tính để các em biết vị trí ngồi của mình. Chữ số vi tính là các số
0,1,2,3,4,5,6,7,8,9 được in ra trên các miếng đề can và dán được lên mặt bàn. Số báo danh của thí sinh được
kết hợp từ các chữ số vi tính đó, ví dụ số báo danh 168 được kết hợp từ 3 chữ số là 1,6, và 8. Số báo danh của
thí sinh được đánh từ 1 đến n, trong đó n là số thí sinh tham gia. Số lượng chữ số vi tính được in ra càng
nhiều, kinh phí càng lớn, do đó ban tổ chức muốn biết tổng số chữ vi tính sẽ được in ra vừa đủ để sử dụng cho
n thí sinh. Ví dụ: nếu có 13 thí sinh tham dự thì các số báo danh cần đánh là 1,2,3,4,5,6,7,8,9,10,11,12,13, như
vậy cần dùng đến 17 chữ số vi tính.
Yêu cầu: hãy giúp ban tổ chức tính toán xem cần in ra bao nhiêu chữ số để đánh số báo danh cho n thí sinh.
Dữ liệu: Vào từ file BAI1.INP chứa duy nhất một số n (1 ≤ n < 109) là số thí sinh sẽ tham dự kỳ thi.
Kết quả: Đưa ra file văn bản BAI1.OUT gồm 1 số duy nhất là tổng số chữ số vi tính cần in từ 1 tới n.

Ví dụ:
BAI1.INP
13

BAI1.OUT
17

Bài 2: NGÔN NGỮ MUMBA
Mỗi từ trong ngôn ngữ của bộ tộc Mumba là một xâu kí tự hình thành chỉ từ hai kí tự a và b theo quy tắc
sau:


Không chứa 2 kí tự b liên tiếp




Không có 3 từ con giống nhau đứng liên tiếp trong một từ, như vậy aaa không phải là một từ Mumba
(có 3 từ con a liên tiếp), aabababa cũng không phải là một từ Mumba (có 3 từ con ab liên tiếp), còn
aba là một từ Mumba.

Yêu cầu: Cho n xâu kí tự, mỗi xâu chỉ gồm các kí tự chữ cái tiếng anh (‘a’..’z’), có độ dài không quá 25 kí tự.
Hãy đếm xem trong n xâu đã cho thì có bao nhiêu xâu là một từ trong ngôn ngữ Mumba.
Dữ liệu vào: vào từ file văn bản BAI2.INP gồm:


Dòng đầu ghi hai số nguyên dương n (n ≤ 100).



N tiếp theo, mỗi dòng ghi một xâu kí tự.

Kết quả: ghi ra file văn bản BAI2.OUT gồm 1 số duy nhất là số lượng từ Mumba đếm được.
Trang 1/3


BAI2.INP

BAI2.OUT

3

1


aabababa
cba
abaa
Bài 3: CẶP ĐÔI HOÀN HẢO
Nhân dịp năm mới Mậu Tuất 2018, đất nước XYZ muốn tuyển chọn một cặp đôi hoàn hảo để trình diễn
màn khiêu vũ tuyệt đẹp vốn là văn hóa lâu đời của đất nước.
Một cặp đôi được gọi là hoàn hảo nếu cặp đôi đó có cả nam và nữ, chênh lệch chiều cao của hai người
không được vượt quá K milimet và chiều cao của người nữ không được cao hơn người nam.
Đất nước đã tuyển chọn được N vũ công gồm cả nam và nữ và muốn biết có bao nhiêu cách để chọn ra
đúng một cặp đôi hoàn hảo.
Yêu cầu: Tính xem có bao nhiêu cách để chọn ra đúng một cặp hoàn hảo, hai cặp khác nhau nếu có ít nhất 1
người được chọn ở cặp này mà không được chọn ở cặp kia.
Dữ liệu vào: vào từ file văn bản BAI3.INP gồm:


Dòng đầu ghi hai số nguyên dương N, K (N ≤ 105; K ≤ 500).



Dòng tiếp theo ghi N số là chiều cao hi của vũ công thứ i.



Quy ước hi > 0 nếu đó là vũ công nam và hi ≤ 0 nếu là nữ. |hi| ≤ 2000

Kết quả: ghi ra file văn bản BAI3.OUT gồm 1 số duy nhất là số lượng cách có thể chọn được.

Ví dụ:
BAI3.INP


BAI3.OUT

42

4

1600 -1601 -1602 1603
Rằng buộc:


Có 50% số test ứng với 50% số điểm của bài có N ≤ 104.



Có 50% số test ứng với 50% số điểm của bài có 104 ≤ N và số vũ công nam không quá 104.

Bài 4. TÍNH TỔNG
Sau buổi học về số học, Minh đã biết cách tính tổng của n số tự nhiên liên tiếp. Ở nhà, Minh tiếp tục
làm các bài tập về tính tổng của các số tự nhiên liên tiếp. Minh thắc mắc, liệu với số tự nhiên K thì có thể
phân tích K thành tổng các số tự nhiên liên tiếp hay không?. Ví dụ với K = 9 (có thể phân tích: 9 = 9; 9 = 5+4;
9 = 2 + 3 + 4) thì có 3 cách phân tích thành tổng các số tự nhiên liên tiếp.
Yêu cầu: Viết chương trình giúp Minh tìm số cách phân tích số nhiên K thành tổng các số tự nhiên liên tiếp.
Dữ liệu vào: Từ file văn bản BAI4.INP một dòng duy nhất chứa số nguyên dương K (K ≤ 1012).
Kết quả: Ghi ra file BAI4.OUT một số duy nhất là số cách phân tích tìm được.

Ví dụ:
BAI4.INP
9

BAI4.OUT

3

Ràng buộc:


Có 1/3 số test ứng với 1/3 số điểm của bài có K ≤ 107;
Trang 2/3




Có 2/3 số test còn lại ứng với 2/3 số điểm của bài có 107 < K ≤ 1012.

Bài 5. ĐẾM DÃY CHIA HẾT
Cho một dãy số nguyên dương, yêu cầu hãy đếm số lượng dãy con liên tiếp có tổng chia hết cho

.

Hai dãy con được gọi là khác nhau nếu ít nhất một trong hai điểm đầu hoặc điểm cuối hai dãy con đó trong
dãy đã cho là khác nhau. Ví dụ với
. Với

, dãy:

có 4 dãy con thỏa mãn là

và dãy: (1, 1, 1, 1) thì có 4 dãy con thỏa mãn.

Dữ liệu: Vào từ file văn bản BAI5.INP gồm 2 dòng:



Dòng đầu là 2 số nguyên dương d và N (d ≤ 106, N ≤ 105)



Dòng thứ 2 chứa N số nguyên dương biểu diễn dãy số, các số trong dãy không quá 109.

Kết quả: Ghi ra file văn bản BAI5.OUT gồm 1 số duy nhất là kết quả tìm được.
Ví dụ
BAI5.INP
46

BAI5.OUT
4

212141
Rằng buộc:



Có 1/3 số test tương ứng với 1/3 số điểm có N ≤ 103
Có 2/3 số test tương ứng với 2/3 số điểm có 103 < N ≤ 105
Cán bộ coi thi không giải thích gì thêm.
----------------------------- Hết -----------------------------

Trang 3/3


Bài 1: Viết bằng C++
#include<bits/stdc++.h>

using namespace std;
ifstream fi;
ofstream fo;
long long n,i,cs,m,d;
long long a[15],b[15];
int main()
{
a[1]=9;
b[1]=9;
for (i=2;i<=12;i++)
{
a[i]=a[i-1]*10;
b[i]=a[i]*i;
}
fi.open("BAI1.INP");
fi>>n;
fi.close();
m=n;
d=0;
while (m>0)
{
d++;
m=m/10;
}
m=pow(10,d-1);
n=n-m+1;
cs=n*d;
for (i=1;ics=cs+b[i];
fo.open("BAI1.OUT");

fo<fo.close();
return 0;
}

Trang 4/3


Bài 1: Viết bằng PASCAL

var y,x,n:int64;
procedure nhapdl;
begin
assign(input,'bai1.inp');
reset(input);
assign(output,'bai1.out');
rewrite(output);
readln(n);
end;
procedure xuli;
begin
if (n<10) then
write(n)
else
begin
if (n<100) then
write(9+(n-9)*2)
else
begin
if (n<1000) then

write(9+(99-9)*2+(n-99)*3)
else
begin
if (n<10000) then
write(9+90*2+900*3+(n-999)*4)
else
begin
if (n<100000) then
write(9+180+2700+(9000*4)+(n-9999)*5)
else
begin
if (n<1000000) then
write(9+180+2700+36000+(90000*5)+(n-99999)*6)
else
begin
if (n<10000000) then
begin
x:=9+90*2+900*3+9000*4+90000*5+900000*6;
write(x+(n-999999)*7)
end
else
begin
if (n<100000000) then
begin
x:=9+90*2+900*3+9000*4+90000*5+900000*6+9000000*7;
write(x+(n-9999999)*8)
end
else
begin
x:=9+90*2+900*3+9000*4+90000*5+900000*6+9000000*

7+90000000*8;
y:=(n-99999999)*9;
write(x+y);
end;
end;
end;
end;
end;
end;
end;
end;
end;

Trang 5/3


begin
nhapdl;
xuli;
close(input);
close(output);
end.

Trang 6/3


Bài 2: Viết bằng C++
#include<bits/stdc++.h>
using namespace std;
ifstream fi;

ofstream fo;
int i,n,dem;
string s;
////////////////////////////////////////
bool kt(string s)
{
string a;
int i,j,k,n,m,d,p;
if (s.find("bb")!=-1)
return false;
n=s.size()-1;
for (i=0;i<=n;i++)
if (s[i]!='a' && s[i]!='b')
return false;
for (i=0;i<=n;i++)
for (j=i;j<=n;j++)
{
a=s.substr(i,j-i+1);
a=a+a+a;
if (s.find(a)!=-1)
return false;
}
return true;
}
//////////////////////////////////////
int main()
{
fi.open("BAI2.INP");
fi>>n;
fi.ignore();

fo.open("BAI2.OUT");
dem=0;
for(i=1;i<=n;i++)
{
getline(fi,s);
if (kt(s))
dem++;
}
fi.close();
fo<fo.close();
return 0;
}

Trang 7/3


Bài 2: Viết bằng PASCAL
var

i,n,kq:longint;
s:array[0..100] of string;
procedure nhapdl;
begin
assign(input,'bai2.inp');
reset(input);
assign(output,'bai2.out');
rewrite(output);
readln(n);
for i:=1 to n do readln(s[i]);

end;
function kiemtra(i:longint):boolean;
var
j,k:longint;
s1,s2,s3:string;
begin
for j:=1 to length(s[i]) do
if (s[i][j]<>'a') and (s[i][j]<>'b') then exit(false);
for j:=1 to length(s[i])-1 do
if (s[i][j]='b') and (s[i][j+1]='b') then exit(false);
for j:=1 to length(s[i]) div 3 do
begin
for k:=1 to length(s[i])-3*j+1 do
begin
s1:=copy(s[i],k,j);
s2:=copy(s[i],k+j,j);
s3:=copy(s[i],k+j+j,j);
if (s1=s2) and (s1=s3) then exit(false);
end;
end;
exit(true);
end;
procedure xuli;
var
i,j:longint;
begin
kq:=0;
for i:=1 to n do
begin
if kiemtra(i) then

inc(kq);
end;
write(kq);
end;
begin
nhapdl;
xuli;
close(input);
close(output);
end.

Trang 8/3


Bài 4: Viết bằng C++
#include<bits/stdc++.h>
using namespace std;
#define ll long long
long long i,dem,k,n;
ifstream fi;
ofstream fo;
int main()
{
fi.open("BAI4.INP");
fi>>n;
fi.close();
fo.open("BAI4.OUT");
long long max = trunc(sqrt(8*n+1)-1)/2;
dem=1;
for (i=2;i<=max-1;i++)

if((n-i*(i-1)/2)%i==0)
dem++;
fo<fo.close();
return 0;
}

Bài 4: Viết bằng PASCAL
var

n,kq:int64;
procedure nhapdl;
begin
assign(input,'bai4.inp');
reset(input);
assign(output,'bai4.out');
rewrite(output);
readln(n);
end;
procedure cach1;
var
i,j:longint;
m:int64;
begin
kq:=0;
for i:=0 to n do
begin
m:=0;
for j:=0 to n do
begin

m:=m+i+j;
if m=n then kq:=kq+1;
if (m>n) then break;
end;
end;
write(kq);
end;
procedure xuli;
var
i:longint;
m:int64;
begin
kq:=0;
for i:=0 to trunc(sqrt(2*n)) do
begin

Trang 9/3


m:=i;
if (m*(m+1)>n*2) then break;
if (2*n mod (m+1)=0) and (((2*n div (m+1))-m) mod 2=0) then
inc(kq);
end;
write(kq);
end;
begin
nhapdl;
//cach1;
//writeln;

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

Bài 3 và bài 5:
xem trong file đính kèm (có cả code bằng C++ và Pascal)

Trang 10/3



×