Đề thi chọn học sinh giỏi vòng 2 tham dự kì thi học sinh giỏi quốc gia lớp 12 THPT năm 2015 môn Tin học - Sở GD&ĐT Ninh Bình (Có đáp án)

Tý là một học sinh tham dự cuộc thi Olympic Tin học quốc tế năm 2014. Do lần đầu ra nước ngoài nên bạn ấy muốn mua các món quà lưu niệm tặng các bạn ở trường. Sau những buổi thi căng thẳng, ban tổ chức dẫn các thí sinh dự thi đi tham quan danh lam thắng cảnh và những cửa hàng lưu niệm của địa phương.

doc10 trang | Chia sẻ: Thái Huyền | Ngày: 28/07/2023 | Lượt xem: 363 | Lượt tải: 0download
Bạn đang xem nội dung Đề thi chọn học sinh giỏi vòng 2 tham dự kì thi học sinh giỏi quốc gia lớp 12 THPT năm 2015 môn Tin học - Sở GD&ĐT Ninh Bình (Có đáp án), để tải tài liệu về máy bạn hãy click vào nút TẢI VỀ
SỞ GD&ĐT NINH BÌNH
ĐỀ THI CHÍNH THỨC
ĐỀ THI CHỌN HSG VÒNG 2 THAM DỰ KÌ THI
HSG QUỐC GIA LỚP 12 THPT NĂM 2015
MÔN: TIN HỌC
Ngày thi 01/11/2014
Thời gian 180 phút không kể thời gian phát đề
(Đề thi gồm 04 câu, trong 03 trang)
Tổng quan đề thi:
Bài
Chương trình
Input
Output
Thời gian
1- Mua quà
BUYGIFTS.PAS
BUYGIFTS.INP
BUYGIFTS.OUT
1giây/test
2- Sơn hàng rào
PAINT.PAS
PAINT.INP
PAINT.OUT
1giây/test
3- CITY
CITY.PAS
CITY.INP
CITY.OUT
1giây/test
4- BUS
BUS.PAS
BUS.INP
BUS.OUT
1giây/test
Câu 1. Mua quà (6 điểm) 
Tý là một học sinh tham dự cuộc thi Olympic Tin học quốc tế năm 2014. Do lần đầu ra nước ngoài nên bạn ấy muốn mua các món quà lưu niệm tặng các bạn ở trường. Sau những buổi thi căng thẳng, ban tổ chức dẫn các thí sinh dự thi đi tham quan danh lam thắng cảnh và những cửa hàng lưu niệm của địa phương.
Sau khi đi lòng vòng Tý bước vào một cửa hàng lưu niệm bán những món quà mà bạn ấy yêu thích. Chủ cửa hàng giới thiệu cho Tý () món quà, món quà thứ () có giá (). 
Tý muốn chọn mua () món quà sao cho độ chênh lệch giữa giá món quà rẻ nhất và đắt nhất là tối thiểu. Vì đi chơi nên Tý không mang theo máy tính nên bạn hãy giúp bạn ấy tính xem có thể mua các món quà với độ chênh lệch nhỏ nhất.
 Dữ liệu vào: từ file văn bản BUYGIFTS.INP có cấu trúc như sau:
	- Dòng 1: ghi hai số nguyên dương n và m.
	- Dòng 2: ghi số nguyên lần lượt là .
	- Các số trên cùng một dòng cách nhau một dấu cách.
Kết quả: ghi ra file BUYGIFTS.OUT gồm một số nguyên dương là độ lệch tối thiểu.
Ví dụ:
BUYGIFTS.INP
BUYGIFTS.INP
Giải thích
6 4
10 12 10 5 7 22
5
Tý có thể mua các món quà có giá trị: 
10, 12, 10, 7.
Câu 2. Sơn hàng rào (6 điểm) 
Mr Bean muốn sơn lại hàng rào nhà mình. Hàng rào của anh ấy được ghép bởi n () tấm ván liên tiếp, mỗi tấm rộng 1 cm và có chiều cao khác nhau, tấm ván thứ () chiều cao là (). Mr Bean muốn sơn hàng rào nhà mình sao cho thật đặc biệt. Ban đầu anh ta tiến hành khảo sát hệ thống hàng rào, để tìm ra chiều cao của tấm ghép thấp nhất trong một đoạn liên tiếp các tấm ván từ tấm thứ i đến tấm thứ j (i£j). Có m (m£105) đoạn liên tiếp cần khảo sát lần lượt là: (i1, j1), (i2, j2), (i3, j3),  , (im, jm). 
Thông tin về các đoạn liên tiếp này thỏa mãn 2 điều kiện:
 (i1 £ i2 ££ im-1 £ im ) và (j1£ j2 £  £ jm-1 £ jm)
Dữ liệu vào: từ file văn bản PAINT.INP có cấu trúc như sau:	
	- Dòng 1: ghi hai số nguyên dương n và m.
	- Dòng 2: ghi n số nguyên dương lần lượt là .
	- m dòng tiếp theo, dòng thứ k ghi hai số ik, jk là thông tin về đoạn hàng rào thứ k mà Mr Bean cần khảo sát.
Dữ liệu ra: ghi ra file PAINT.OUT gồm m dòng, dòng thứ i là chiều cao của tấm ghép thấp nhất trong đoạn hàng rào khảo sát thứ i.
Ví dụ:
PAINT.INP
PAINT.OUT
5 5
3 6 8 2 1
1 3
2 3
3 4
3 5
4 5
3
6
2
1
1
Câu 3. CITY (5 điểm)
	Một vương quốc có n thành phố đánh số từ 1 đến n, có m tuyến đường hai chiều, mỗi tuyến đường nối một cặp thành phố và có độ dài xác định. Hai thành phố được nối với nhau bởi không quá một con đường. Công ty X có trụ sở đặt thành phố A và thành phố B. Để giảm chi phí cho việc vận chuyển hàng, Giám đốc công ty muốn xây dựng một trụ sở mới tại một thành phố khác A và B.
Yêu cầu: Hãy tìm danh sách các thành phố để công ty có thể đặt trụ sở tại đó, sao cho tổng khoảng cách từ thành phố này đến hai thành phố A và B là ngắn nhất có thể.
Dữ liệu vào: Ghi trong file văn bản CITY.INP có cấu trúc như sau:
- Dòng đầu tiên ghi 2 số nguyên dương n, m (2 £ n £ 104, 0 £ m £ 105).
- Dòng thứ 2 ghi 2 số A, B.
- m dòng tiếp theo mỗi dòng gồm 3 số u, v, c (1 £ u, v £ n, u khác v, 1 £ c £ 105), là thông tin về tuyến đường hai chiều nối giữa hai thành phố u và v với độ dài là c.
Dữ liệu ra: Ghi vào file văn bản CITY.OUT có cấu trúc như sau:
	- Dòng đầu tiên ghi một số nguyên K là số lượng các thành phố công ty Beta có thể đặt trụ sở tại đó.
	- K dòng tiếp theo ghi ra danh sách các thành phố tìm được. Số hiệu của các thành phố được ghi theo thứ tự tăng dần.
CITY.INP 
CITY.OUT 
5 7
1 5
1 2 2
1 3 1
1 4 2
2 3 1
2 4 3
2 5 3
4 5 4
2
2
3
Câu 4. BUS (3 điểm)
Hãng taxi BUS có n bến đỗ và có m taxi. Có 1 điều đặc biệt là mỗi taxi sẽ chỉ được đi trên 1 con đường hai chiều nối trực tiếp giữa 2 bến taxi, không có 2 taxi nào cùng hoạt động trên một tuyến đường.
Tí và Tèo nhận ra rằng vẫn có một số bến taxi không được “kết nối”, bến taxi A được “kết nối” với bến B nếu tồn tại một đường đi trực tiếp hoặc gián tiếp từ A đến B. Tí và Tèo đề xuất 2 sáng kiến để giải quyết vấn đề này:
- Một số taxi sẽ chuyển làn, chi phí chuyển làn của mỗi taxi là khác nhau.
- Mua thêm một số taxi mới, mỗi taxi mới có giá C, taxi này sẽ chạy trên một làn đường chưa được chọn bởi bất kỳ taxi nào khác.
Sau khi xem xét, Tí và Tèo quyết định tìm số tiền nhỏ nhất phải trả để cho tất cả các bến taxi được “kết nối” với nhau và số taxi mua mới càng ít càng tốt. Nhiệm vụ của bạn là giúp Tí và Tèo tìm số tiền nhỏ nhất phải chi, số lượng taxi mới cần phải mua và số lượng taxi phải chuyển làn.
Dữ liệu vào: Ghi trong file văn bản BUS.INP 
Dòng đầu tiên ghi 3 số n, m, C (2 £ n £ 104, 0 £ m £ 104, 1 £ C £ 105) lần lượt là số bến taxi, số xe taxi và chi phí để mua 1 taxi mới.
m dòng tiếp theo, dòng thứ i gồm 3 số u, v, r (1 £ a, b £ n, a khác b, 1 £ r £ 105) thể hiện xe taxi thứ i chạy trên tuyến đường từ u đến v sẽ cần r đơn vị tiền để chuyển làn.
Dữ liệu ra: Ghi ra file văn bản BUS.OUT có cấu trúc như sau:
Gồm 3 số lần lượt là số lượng taxi mới cần mua, số lượng taxi cũ phải chuyển làn và chi phí nhỏ nhất để thực hiện. (các số trên cùng một dòng cách nhau bởi dấu cách)
BUS.INP
BUS.OUT
Giải thích: 
- Mua thêm một xe mới.
- Xe hoạt động trên tuyến đường 1- 5 cần chuyển làn.
Tổng chi phí 
= 10 + 15 = 25
7 5 15
1 2 15
1 5 10
2 5 20
5 7 10
4 3 10
1 1 25
BUS.INP
BUS.OUT
Giải thích: 
- Mua thêm 2 xe mới.
- Không xe nào chuyển làn
Tổng chi phí 
= 15 x 2 = 30
25
7 5 15
1 2 25
1 5 30
2 5 20
5 7 10
4 3 10
2 0 30
50% số test có n, m <= 100.
------------- HẾT -------------
Chữ ký giám thị 1:	 Chữ ký giám thị 2: 
Họ và tên thí sinh :....................................................... Số báo danh .......................................
SỞ GD&ĐT NINH BÌNH
ĐỀ THI CHỌN HSG VÒNG 2 THAM DỰ KÌ THI
HSG QUỐC GIA LỚP 12 THPT NĂM 2015
MÔN: TIN HỌC
(hướng dẫn chấm gồm......trang)
Câu
Đáp án
Điểm
Câu 1. 
uses math;
const nmax = round(5e3)+3;
 oo = round(1e18);
var a: array[1..1000001] of longint;
 m,n: longint;
procedure openf;
var i,u,v,c:longint;
begin
 assign(input,'BUYGIFTS.INP'); Reset(input);
 assign(output,'BUYGIFTS.OUT'); Rewrite(output);
 read(n,m);
 for i:=1 to n do read(a[i]);
end;
{-------------}
procedure swap(i,j: longint);
var tg:longint;
begin
 tg:= a[i]; a[i]:= a[j]; a[j]:= tg;
end;
{------------}
procedure qs(l,r: longint);
var i,j,k: longint;
begin
 if l>= r then exit;
 i:= l; j:= r;
 k:= a[(l+r) div 2] ;
 repeat
 while a[i]< k do inc(i);
 while a[j]> k do dec(j);
 if i<=j then
 begin
 swap(i,j);
 inc(i);
 dec(j);
 end;
 until i> j;
 qs(l,j); qs(i,r);
end;
{-----------}
procedure xuly;
var i, res:longint;
begin
 qs(1,n);
 res:= MAXLONGINT;
 for i:=1 to n-m+1 do
 begin
 if res> (a[i+m-1]- a[i]) then res:= a[i+m-1]- a[i];
 end;
 write(res);
end;
{-----------}
BEGIN
 OPENF;
 XULY;
 CLOSE(INPUT);
 CLOSE(OUTPUT);
END.
6.0 điểm
Câu 2.
 program PAINT;
 const fi='PAINT.INP';
 fo='PAINT.OUT';
 type point=record
 x,y:longint;
 end;
 var a,q:array[0..100001] of longint;
 f:array[1..100001] of point;
 n,m,first,last:longint;
 //
 procedure nhap;
 var i,j:longint;
 begin
 assign(input,fi);reset(input);
 readln(n,m);
 for i:=1 to n do read(a[i]);
 readln;
 for j:=1 to m do readln(f[j].x,f[j].y);
 close(input);
 end;
 //
 procedure push(x:longint);
 begin
 inc(last);
 q[last]:=x;
 if last=1 then first:=1;
 end;
 //
 procedure xuly;
 var i,d:longint;
 begin
 assign(output,fo);rewrite(output);
 first:=1;
 last:=-1;
 d:=0;
 a[0]:=-1;
 push(0);
 for i := 1 to m do
 begin
 while d<f[i].y do
 begin
 inc(d);
 if a[d]>=a[q[last]] then push(d)
 else
 begin
 while (first<=last) and (a[d]<a[q[last]]) do dec(last);
 push(d);
 end;
 end;
 while q[first]<f[i].x do inc(first);
 writeln(a[q[first]]);
 end;
 close(output);
 end;
 //
 BEGIN
 nhap;
 xuly;
 END.
6.0 điểm
Câu 3.
Program city;
Const
 InputFile = 'CITY.INP';
 OutputFile = 'CITY.OUT';
 maxn=5001;
 maxm=100001;
 vc=maxlongint;
type
 arrN=array[0..maxn] of longint;
var
 n, m: longint;
 a,b: longint;
 cost: array[1..maxn] of longint;
 d, c, r: array[1..maxm] of longint;
 tro: array[1..maxn] of longint;
 ke, ts: array[1..2*maxm] of longint;
 color: arrN;
 qn: longint;
 q, vt: arrN;
 kc1, kc2: arrN;
 ds: longint;
 Kq: array[1..10000] of longint;
 sl: longint;
procedure Up(var kc: arrN; k: longint);
var v: longint;
begin
 v:=q[k];
 while kc[q[k div 2]]>kc[v] do
 begin
 q[k]:=q[k div 2];
 vt[q[k]]:=k;
 k:=k div 2;
 end;
 q[k]:=v;
 vt[v]:=k;
end;
procedure down(var kc: arrN; k: longint);
var v, l: longint;
begin
 v:=q[k];
 while 2*k<=qn do
 begin
 l:=2*k;
 if (l<qn) and (kc[q[l+1]]<kc[q[l]]) then inc(l);
 if kc[q[l]]>=kc[v] then break;
 q[k]:=q[l];
 vt[q[k]]:=k;
 k:=l;
 end;
 q[k]:=v;
 vt[v]:=k;
end;
procedure initq(var kc: arrN);
begin
 qn:=0;
 vt[0]:=0;
 kc[0]:=-1;
end;
procedure put(var kc: arrN; u: longint);
begin
 inc(qn);
 q[qn]:=u;
 vt[u]:=qn;
 Up(kc,qn);
end;
function Get(var kc: arrN): longint;
begin
 Get:=q[1];
 q[1]:=q[qn];
 vt[q[1]]:=1;
 dec(qn);
 down(kc,1);
end;
function qempty: boolean;
begin
 exit(qn=0);
end;
Procedure Dijstra(xp: longint; var kc: arrN);
var u, i, v: longint;
begin
 fillchar(color,sizeof(color),0);
 initq(kc);
 put(kc,xp); color[xp]:=1; kc[xp]:=0;
 repeat
 u:=get(kc); color[u]:=2;
 for i:=tro[u] to tro[u+1]-1 do
 begin
 v:=ke[i];
 case color[v] of
 0: begin
 kc[v]:=kc[u]+Ts[i];
 put(kc,v);
 color[v]:=1;
 end;
 1: if kc[v]>kc[u]+Ts[i] then
 begin
 kc[v]:=kc[u]+Ts[i];
 Up(kc,Vt[v]);
 end;
 end;
 end;
 until qempty;
end;
Procedure Doc;
var k, i, u, L, v: longint;
begin
 read(n,m);
 read(a,b);
 for i:=1 to m do read(d[i],c[i],r[i]);
 // Init Graph
 for i:=1 to m do
 begin
 inc(tro[d[i]]);
 inc(tro[c[i]]);
 end;
 v:=0;
 for i:=1 to n do
 begin
 u:=tro[i];
 tro[i]:=v+1;
 v:=v+u;
 end;
 tro[n+1]:=v+1;
 for i:=1 to m do
 begin
 u:=d[i];
 v:=c[i];
 ke[tro[u]]:=v; Ts[tro[u]]:=r[i];
 ke[tro[v]]:=u; Ts[tro[v]]:=r[i];
 inc(tro[u]);
 inc(tro[v]);
 end;
 for i:=n downto 2 do tro[i]:=tro[i-1];
 tro[1]:=1;
end;
procedure process;
var i: longint; min:longint;
begin
 sl:=0;
 min:=maxlongint;
 for i:=1 to n do
 if (ia)and(ib) then
 begin
 if kc1[i]+ kc2[i] = min then
 begin
 inc(sl); kq[sl]:=i;
 end;
 if kc1[i] + kc2[i] < min then
 begin
 min:= kc1[i]+kc2[i];
 sl:=1;
 kq[sl]:= i;
 end;
 end;
end;
Procedure Main;
var i:longint ;
Begin
 assign(Input,InputFile); reset(Input);
 assign(Output,OutputFile); rewrite(Output);
 Doc;
 Dijstra(a,kc1);
 Dijstra(b,kc2);
 process;
 writeln(sl);
 for i:=1 to sl do
 writeln(kq[i]);
 close(Input); Close(Output);
End;
BEGIN
 Main;
END.
6.0 điểm
Câu 4.
const fi = 'BUS.INP';
 fo = 'BUS.OUT';
type diem= record
 u,v,c: longint;
 end;
var p: array [1..100000] of longint;
 mua,chuyen,kq:longint;
 n,m,cc: longint;
 ds: array [1..100000] of diem;
 sl:longint;dem:longint;
 thua:array[1..100000] of longint;
procedure doc;
var i: longint;
begin
 assign(input,fi); reset(input);
 read(n,m,cc);
 for i:=1 to m do
 read (ds[i].u, ds[i].v,ds[i].c);
 close(input);
end;
{--------------}
procedure swap(var a,b:diem);
var tg:diem;
begin
 tg:=a; a:=b; b:=tg;
end;
{---------------}
procedure qs(l,r:longint);
var i,j,key: longint;
begin
 if l>=r then exit;
 key:= ds[(l+r) div 2].c;
 i:=l; j:=r;
 repeat
 while ds[i].c< key do inc(i);
 while ds[j].c> key do dec(j);
 if i<=j then
 begin
 swap(ds[i],ds[j]);
 inc(i); dec(j);
 end;
 until i>j;
 qs(l,j); qs(i,r);
end;
{--------------------------------}
procedure init;
var i:longint;
begin
 for i:=1 to n do p[i]:= -1;
end;
{------------------------------}
function findset(i:longint):longint;
begin
 if p[i]< 0 then findset:= i
 else
 begin
 p[i]:= findset(p[i]);
 findset:= p[i];
 end;
end;
{------------------------------}
procedure union(i,j:longint);
var u,v:longint;
begin
 u:= findset(i);
 v:= findset(j);
 if u=v then exit;
 if (p[u]<p[v]) then
 begin
 p[u]:= p[u]+p[v];
 p[v]:= u;
 end
 else
 begin
 p[v]:= p[v]+ p[u];
 p[u]:= v;
 end;
end;
{--------------------------------}
procedure xuly;
var i:longint; u,v,c:longint;
begin
 dem:=0; sl:=0;
 for i:= m downto 1 do
 begin
 u:= ds[i].u;
 v:= ds[i].v;
 c:= ds[i].c;
 if findset(u) findset(v) then
 begin
 inc(dem);
 union(u,v);
 end
 else
 begin
 inc(sl);
 thua[sl]:= c;
 end;
 end;
 mua:= 0;
 chuyen:= 0;
 kq:= 0;
 if dem = n-1 then exit;
 for i:= sl downto 1 do
 begin
 if (dem = n-1) or (thua[i]>cC) then break;
 kq:= kq+thua[i];
 inc(chuyen);
 inc(dem);
 end;
 if dem= n-1 then exit;
 mua:= n-1 -dem;
 kq:= kq+ mua*cc;
end;
{-----------------}
procedure inkq;
begin
 assign(output,fo);
 rewrite(output);
 write(mua,' ',chuyen,' ',kq);
 close(output);
end;
{--------------}
begin
 randomize;
 doc;
 init;
 qs(1,m);
 xuly;
 inkq;
end.
6.0 điểm
-----------Hết-----------

File đính kèm:

  • docde_thi_chon_hoc_sinh_gioi_vong_2_tham_du_ki_thi_hoc_sinh_gio.doc