Đáp án HSG Tin học lớp 11 Quảng Bình 2017-2018 - Học Toàn Tập

4 119 0
Đáp án HSG Tin học lớp 11 Quảng Bình 2017-2018 - Học Toàn Tập

Đang tải... (xem toàn văn)

Thông tin tài liệu

- 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;

Ngày đăng: 23/02/2021, 19:21

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan