- 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]
Trang 1SỞ 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 bộ dữ liệu vào, tính toán kết quả Thực hiện chương trình của học sinh và so sánh kết quả
- Giám khảo có thể sử dụng chương trình gợi ý dưới đây để tính toán kết quả của dữ liệu vào
- Chương trình học sinh đúng một bộ test, giám khảo cho 0,5 điểm hoặc 0,25 điểm
- 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 bộ test có dữ liệu lớn
II- Chương trình gợi ý:
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) do
if st[j] in ['0' '9'] then
begin
i:=j;
xso:='';
while st[i] in ['0' '9'] do begin xso:=xso+st[i]; i:=i+1; end;
val(xso,n,code);
for k:=1 to n do write(g,st[i]);
j:=i+1
end
else begin write(g,st[j]); j:=j+1; end;
close(f); close(g);
end
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;
kt:boolean;
begin
Trang 2assign(f,fi);
reset(f);
assign(g,fo);
rewrite(g);
readln(f,n);
for i:=1 to n do read(f,a[i]);
b:=0;l:=0;x:=0;i:=1;
a[n+1]:=a[1];
while i<=n do
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) do 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) do 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) do inc(i);
kt:=false;
end;
inc(i);
end;
write(g,b,' ',l,' ',x);
close(f);
close(g);
end
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 do
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
tam:=2001;
Trang 3u:=0;
for i:=1 to max do
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 do
for j:=1 to max do
if a[i,j]<>0 then c[i,j]:=a[i,j]
else c[i,j]:=2001;
for i:=1 to max do
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 do
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 do
begin
inc(dem);
kq[dem]:=tr[i];
i:=tr[i];
end;
writeln(f,d[t]); {For i:=dem downto 1 do write(f,kq[i],' ');} end;
close(f);
end;
begin
doc;
xuly(s);
truyvet(t);
end
Trang 4Câu 4 (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:= 1 to n do
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:= 2 to n do
if l1=t then
break
else
begin
l:=l1;
for j:= 0 to l do
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)) do
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 do
begin
c[b[t]]:=1;
t:=t-a[b[t]];
end;
for i:= 2 to n do
if c[i]=0 then
write(f,'+')
else
write(f,'-');
end;
close(f);
end