- Nếu chương trình của học sinh đưa ra kết quả khác với đáp án của giám khảo nhưng vẫn đúng thì giám khảo cho điểm tối đa của bộ test đó.. - Với mỗi câu, giám khảo phải tạo ít nhất một [r]
(1)1/4
SỞ GD&ĐT QUẢNG BÌNH KỲ THI CHỌN HỌC SINH GIỎI CẤP TỈNH NĂM HỌC 2017 - 2018
HƯỚNG DẪN CHẤM LỚP 11 THPT Môn thi: TIN HỌC
(Khóa thi ngày 22 tháng 03 năm 2018)
Thời gian làm bài: 180 phút (không kể thời gian giao đề) I- Phương pháp:
- Giám khảo tạo liệu vào, tính tốn kết Thực chương trình học sinh so sánh kết
- Giám khảo sử dụng chương trình gợi ý để tính tốn kết của liệu vào
- Chương trình học sinh test, giám khảo cho 0,5 điểm 0,25 điểm
- Nếu chương trình học sinh đưa kết khác với đáp án giám khảo nhưng giám khảo cho điểm tối đa test
- Với câu, giám khảo phải tạo test có liệu lớn
II- Chương trình gợi ý:
Câu (3.0 điểm): Giải nén xâu UNZIP.PAS
const
fi='unzip.inp'; fo='unzip.out'; var st,xso:string; f,g:text;
i,j,k,n,code:integer; begin
assign(f,fi); assign(g,fo); reset(f); rewrite(g); readln(f,st); j:=1;
while j<=length(st) if st[j] in ['0' '9'] then begin
i:=j; xso:='';
while st[i] in ['0' '9'] begin xso:=xso+st[i]; i:=i+1; end; val(xso,n,code);
for k:=1 to n write(g,st[i]); j:=i+1
end
else begin write(g,st[j]); j:=j+1; end; close(f); close(g);
end
Câu (3.0 điểm): Đường chạy địa hình ROUTE.PAS
program route;
const fi='route.inp'; fo='route.out';
type mang=array[1 30002] of integer; var a:mang;
i,j,l,x,b,n:integer; f,g:text;
(2)2/4
assign(f,fi); reset(f); assign(g,fo); rewrite(g); readln(f,n);
for i:=1 to n read(f,a[i]); b:=0;l:=0;x:=0;i:=1;
a[n+1]:=a[1]; while i<=n begin
kt:=true;
if (a[i]<a[i+1]) and kt then begin
inc(l);
while (a[i+1]<a[i+2]) and (i<=n-1) i:=i+1; kt:=false;
end;
if (a[i]>a[i+1]) and kt then begin
inc(x);
while (a[i+1]>a[i+2]) and (i<=n-1) inc(i); kt:=false;
end;
if (a[i]=a[i+1]) and kt then begin
inc(b);
while (a[i+1]=a[i+2]) and (i<=n-1) inc(i); kt:=false;
end; inc(i); end;
write(g,b,' ',l,' ',x); close(f);
close(g); end
Câu (2.0 điểm): Chuổi kết nối CONNECT.PAS
const fi='CONNECT.INP'; fo='CONNECT.OUT'; var f:text;
a,c:array[1 100,1 100] of integer; d,tr,kq:array[1 100] of integer; nap:array[1 100] of boolean; m,s,t,i,j,x,y,z,max:integer; procedure doc;
var i:integer; begin
assign(f,fi); reset(f);
readln(f,m,s,t); max:=0;
for i:=1 to m begin
readln(f,x,y,z);
a[x,z]:=y; a[z,x]:=y; if x>max then max:=x; if z>max then max:=z; end;
end;
function min:integer; var u,i,tam:integer; begin
(3)3/4
u:=0;
for i:=1 to max
if (nap[i]=false) and (d[i]<tam) then begin
tam:=d[i]; u:=i; end; min:=u; end;
procedure xuly(s:integer); var i,j:integer;
begin
for i:=1 to max for j:=1 to max
if a[i,j]<>0 then c[i,j]:=a[i,j] else c[i,j]:=2001;
for i:=1 to max begin
d[i]:=c[s,i]; nap[i]:=false; tr[i]:=s; end;
d[s]:=0; repeat i:=min;
if i=0 then break; nap[i]:=true; for j:=1 to max
if (nap[j]=false) and (d[j]>d[i]+c[i,j]) then begin
tr[j]:=i;
d[j]:=d[i]+c[i,j]; end;
until false; end;
procedure truyvet(t:integer); var i,dem:integer;
begin
assign(f,fo); rewrite(f);
if d[t]=2001 then write(f,'NO') else
begin
writeln(f,'YES'); i:=t;
dem:=1; kq[1]:=t; while i<>s begin
inc(dem);
kq[dem]:=tr[i]; i:=tr[i];
end;
writeln(f,d[t]); {For i:=dem downto write(f,kq[i],' ');} end;
close(f); end;
(4)4/4
Câu (2.0 điểm): Dãy chia hết SIGN.PAS
const fi='sign.inp'; fo='sign.out'; var f:text;
a,c:array[-2 100]of longint; b:array[-2 100000000]of longint; tong,t,l,l1,k,n,i,j:longint; begin
assign(f,fi); reset(f); tong:=0;
readln(f,n,k); for i:= to n begin
read(f,a[i]); tong:=tong+a[i]; end;
close(f); assign(f,fo); rewrite(f); b[0]:=-1;
t:=(tong-k) div 2; l:=0; l1:=0;
for i:= to n if l1=t then break else begin l:=l1;
for j:= to l
if (b[j]<>i) and(b[j]<>0)and(j+a[i]<=t)and(b[j+a[i]]=0) then begin
b[j+a[i]]:=i;
if (j+a[i]>l1) then l1:=j+a[i];
end; end;
while (t>0) and (((tong-2*t) mod k<>0)or(b[t]=0)) begin
t:=t-1; end;
if (b[t]=0) or(t<1) then writeln(f,0)
else begin
write(f,1); while b[t]>0 begin
c[b[t]]:=1; t:=t-a[b[t]]; end;
for i:= to n if c[i]=0 then write(f,'+') else
write(f,'-'); end;