Đề 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. Cảm ơn
Trang 1SỞ GIÁO DỤC VÀ ĐÀO TẠO
THANH HOÁ
KỲ THI CHỌN ĐỘI TUYỂN DỰ THI HSGQG LỚP 12 THPT
NĂM HỌC 2013 – 2014
MÔN THI: TIN HỌC
Ngày thi: 08 – 10 – 2013
Thời gian 180 phút, không kể thời gian giao đề
(Đề gồm 3 câu, 2 trang)
Tổng quan bài thi :
Câu Tên bài Tên file nguồn Tên file input Tên file output Điểm
Hãy lập trình giải các bài toán sau:
Câu 1 CHU KỲ
Cho xâu S chỉ gồm các kí tự từ '0' đến '9' và từ 'a' đến 'z' Xâu S bao giờ cũng biểu diễn được dưới dạng WT.
Ví dụ: ababab = ab3 hoặc ababab1
Yêu cầu: Tìm cách biểu diễn xâu S dưới dạng WT sao cho độ dài của xâu W nhỏ nhất.
Dữ liệu: Vào từ file văn bản CHUKY.INP gồm một dòng chứa xâu kí tự S có độ dài không
vượt quá 107.
Kết quả: Ghi ra file văn bản CHUKY.OUT một số duy nhất là độ dài xâu W tìm được.
Ví dụ:
Câu 2 CHI PHÍ
Cơ sở mới của trường đã
được xây dựng xong, tuy vậy vẫn
còn một số hạng mục chưa hoàn
thành, trong đó có khu giáo dục
thể chất ngoài trời Nhà trường
cần hoàn thiện gấp đường chạy
cho các tiết thể dục vào đầu năm
học Khu giáo dục thể chất ngoài
trời có dạng lưới ô vuông kích
thước n×m ô Các hàng và cột đánh số từ 1, từ trên xuống dưới và từ trái qua phải Ô xuất
phát và ô kết thúc đường chạy là cố định và được cho trước Cần phải tổ chức dọn dẹp, san lấp các ô để được một đường chạy độ rộng một ô và bao gồm các ô kề cạnh Chi phí dọn dẹp các ô có thể là khác nhau, vì vậy cần chọn đường chạy sao cho tổng chi phí dọn dẹp là nhỏ nhất
ĐỀ CHÍNH THỨC
SBD: ………
Trang 2Yêu cầu: Cho n, m, (xs,ys) – tọa độ ô xuất phát, (xf, yf) – tọa độ ô kết thúc và chi phí dọn dẹp
ô (i, j) là Cij Hãy xác định chi phí nhỏ nhất để dọn dẹp đường chạy.
Dữ liệu: Vào từ file văn bản CHIPHI.INP gồm:
- Dòng đầu tiên chứa 2 số nguyên n và m (1≤ n, m≤150)
- Mỗi dòng trong n dòng tiếp theo chứa m số nguyên không âm xác định chi phí dọn dẹp
các ô trên dòng (mỗi số không vượt quá 100).
- Dòng n+2 chứa 2 số nguyên xs và ys
- Dòng cuối cùng chứa 2 số nguyên xf và yf.
(Các số trên một dòng được cách nhau bởi dấu cách)
Kết quả: Đưa ra file văn bản CHIPHI.OUT chứa một số nguyên là chi phí dọn dẹp đường chạy.
Ví dụ:
CHIPHI.INP CHIPHI.OUT
3 3
1 1 1
1 1 1
10 1 1
1 1
3 3
5
Câu 3 CANH GÁC
Nông trang có rất nhiều ngọn đồi, để bảo vệ nông trang, John muốn đặt người canh gác trên các ngọn đồi này John băn khoăn không biết sẽ cần bao nhiêu người canh gác nếu như anh ta muốn đặt 1 người canh gác trên đỉnh của mỗi đồi Anh ta có bản đồ của nông trang là một bảng gồm N hàng và M cột Mỗi phần tử của bảng là độ cao Hij so với mặt nước biển của ô (i, j)
Đỉnh đồi là 1 hoặc nhiều ô nằm kề nhau của bảng có cùng độ cao được bao quanh bởi cạnh của bản đồ hoặc bởi các ô có độ cao nhỏ hơn Hai ô gọi là kề nhau nếu độ chênh lệch giữa tọa độ X không quá 1 và chênh lệch tọa độ Y không quá 1.
Yêu cầu: Hãy giúp John xác định số lượng đỉnh đồi trên bản đồ.
Dữ liệu: Vào từ file văn bản CANHGAC.INP gồm:
- Dòng đầu chứa hai số nguyên N và M được cách nhau bởi dấu cách (1<N,M≤ 700).
- N dòng tiếp theo: Mỗi dòng mô tả hàng i của bảng với M số nguyên Hij, các số cách nhau bởi dấu cách (0≤Hij≤104).
Kết quả: Ghi vào file văn bản CANHGAC.OUT một số nguyên duy nhất là số lượng đỉnh đồi.
Ví dụ:
8 7
4 3 2 2 1 0 1
3
Trang 3const fi='chuky.inp';
fo='chuky.out';
var f:text;
st,s:ansistring;
i,n:longint;
{=============================}
procedure docdl;
begin
assign(f,fi);
reset(f);
s:='';
while not eof(f) do
begin
readln(f,st);
s:=s+st;
end;
close(f);
end;
{=============================}
function check(k:longint):boolean;
var j:longint;
begin
st:=copy(s,1,k);
j:=k+1;
while j<=n-k+1 do
if copy(s,j,k)=st then
j:=j+k
else
break;
if j>n then
check:=true
else
check:=false;
end;
{=============================}
begin
docdl;
assign(f,fo); rewrite(f);
n:=length(s);
i:=1;
while (i<=n) and (not check(i)) do
i:=i+1;
writeln(f,i);
close(f);
end
Trang 4const fi='chiphi.INP';
fo='chiphi.OUT';
dx:array[1 4] of integer=(0,1,0,-1);
dy:array[1 4] of integer=(1,0,-1,0);
type bg=record
u,v:longint;
end;
var d,pos,c:array[0 150,0 150] of longint;
s1,s2,f1,f2,m,n,spt:longint;
vt:array[0 100000] of bg;
procedure docfile;
var i,j:longint;
begin
assign(input,fi);
reset(input);
readln(m,n);
for i:=1 to m do
for j:=1 to n do
read(c[i,j]);
readln(s1,s2);
readln(f1,f2);
assign(output,fo);
rewrite(output);
end;
procedure dongfile;
begin
close(input);
close(output);
end;
procedure capnhat(u,v:longint);
var p,c:longint;
begin
c:=pos[u,v];
if c=0 then
begin
inc(spt);
c:=spt;
end;
repeat
p:=c div 2;
if (p=0) or (d[vt[p].u,vt[p].v]<=d[u,v]) then break;
vt[c]:=vt[p];
pos[vt[c].u,vt[c].v]:=c;
c:=p;
until false;
vt[c].u:=u; vt[c].v:=v;
pos[u,v]:=c;
end;
function trace:bg;
var p,c,u,v:longint;
Trang 5vt[p]:=vt[c];
pos[vt[p].u,vt[p].v]:=p;
p:=c;
until false;
vt[p].u:=u; vt[p].v:=v;
pos[u,v]:=p;
end;
procedure dijktra;
var i,j,u,v,ux,vy:longint;
bg1:bg;
begin
for i:=1 to m do
for j:=1 to n do
begin
d[i,j]:=maxlongint;
pos[i,j]:=0;
end;
d[s1,s2]:=c[s1,s2]; capnhat(s1,s2);
repeat
bg1:=trace;
u:=bg1.u; v:=bg1.v;
if (u=f1) and (v=f2) then
begin
writeln(d[u,v]);
exit;
end;
for i:=1 to 4 do
if (u+dx[i]>=1) and (u+dx[i]<=m) and (v+dy[i]<=n) and
(v+dy[i]>=1) then
begin
ux:=u+dx[i];
vy:=v+dy[i];
if d[ux,vy]>d[u,v]+c[ux,vy] then
begin
d[ux,vy]:=d[u,v]+c[ux,vy];
capnhat(ux,vy);
end;
end;
until false;
end;
procedure xuli;
begin
dijktra;
end;
BEGIN
docfile;
xuli;
dongfile;
END
Trang 6tfi='canhgac.INP';
tfo='canhgac.OUT';
dh:array[1 8]of longint=(0,-1,0,1,-1,-1,1,1);
dc:array[1 8]of longint=(1,0,-1,0,1,-1,-1,1);
max=701;
VAR
fi,fo:text;
LT,dd,a:array[0 max,0 max]of longint;
Q:Array[0 max*max]of longint;
n,m,res,qf,ql:longint;
Function DoiSo(i,j:longint):longint;
Begin
doiso:=(i-1)*n+j;
End;
Procedure DoiDinh(u:longint; var i,j:longint);
Begin
i:=(u-1) div n+1;
j:=(u-1) mod n+1;
End;
Procedure InitQ;
Begin
qf:=1; ql:=1;
End;
Procedure Put(u:longint);
Begin
q[ql]:=u;
inc(ql);
End;
Function Get:longint;
Begin
get:=q[qf];
inc(qf);
End;
Function Qempty:boolean;
Begin
qempty:=qf=ql;
End;
Procedure Input;
Var i,j:longint;
Begin
assign(fi,tfi); reset(fi);
read(fi,m,n);
for i:=1 to m do
Trang 7for j:=1 to n do
begin
for k:=1 to 8 do
begin
ii:=i+dh[k]; jj:=j+dc[k];
if (ii>=1) and (ii<=m) and (jj>=1) and (jj<=n) then
if a[ii,jj]>a[i,j] then dd[i,j]:=1;
if a[ii,jj]<a[i,j] then dd[ii,jj]:=1;
end;
end;
End;
Procedure BFS(xp:longint);
Var ii,jj,i,j,k,u,v:longint;
ok:boolean;
Begin
ok:=true;
InitQ; put(xp);
while not qempty do
begin
u:=get; doidinh(u,i,j);
for k:=1 to 8 do
begin
ii:=i+dh[k]; jj:=j+dc[k];
if (ii>=1) and (ii<=m) and (jj>=1) and (jj<=n) and
(LT[ii,jj]=0) and (a[ii,jj]=a[i,j]) then
begin
LT[ii,jj]:=res;
put(doiso(ii,jj));
if dd[ii,jj]=1 then ok:=false;
end;
end;
end;
if not ok then dec(res);
End;
Procedure Calculate;
Var i,j:longint;
Begin
Fillchar(LT,sizeof(LT),0);
res:=0;
for i:=1 to m do
for j:=1 to n do
if (dd[i,j]=0) and (LT[i,j]=0) then
begin
inc(res);
LT[i,j]:=res;
BFS(doiso(i,j));
end;
End;
Procedure Process;
Begin
Init;
Calculate;
End;
Procedure Output;
Var i,j:longint;
Begin
assign(fo,tfo); rewrite(fo);
Trang 8writeln(fo,res);
close(fo);
End;
BEGIN
Input;
Process;
Output;
END
Trang 10…