Tải bản đầy đủ (.doc) (5 trang)

Download đề và đáp án thi học sinh giỏi lớp 12 môn tin học 2006 2007 tỉnh quảng bình (vòng 2)

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (87.41 KB, 5 trang )

sở giáo dục - đào tạo
Quảng bình

kỳ thi chọn học sinh giỏi lớp 12
năm học 2006-2007

Đề chính thức - môn : tin học (vòng 2)

SBD:

Thời gian làm bài: 180 phút.

Đề ra
Câu 1: (3,0 điểm) Chia bánh
(tên file bài làm CAKE.PAS)
Trong buổi tối trung thu có một cái bánh hình tròn. Bánh đợc viền quanh bởi N
quả dâu và quả sim.
Yêu cầu: Tìm cách cắt bánh bằng một nhát dao để đợc hai phần sao cho số lợng
quả dâu ở phần này bằng số lợng quả dâu ở phần kia và số lợng quả sim ở phần này
bằng số lợng quả sim ở phần kia.
Dữ liệu vào: Cho trong file CAKE.INP có cấu trúc nh sau:
Dòng 1: Ghi số nguyên dơng N là số lợng quả dâu và quả sim ở trên viền bánh
(1 N 255).
Dòng 2: Ghi dãy gồm N ký tự D hoặc S ghi liền nhau. Các vị trí gắn quả
trên bánh đợc đánh số từ 1 đến N theo chiều kim đồng hồ bắt đầu từ một vị trí tuỳ
ý.
Dữ liệu ra: Ghi ra file CAKE.OUT theo cấu trúc nh sau:
Dòng 1: Nếu tìm đợc cách chia thì ghi hai số nguyên dơng a, b (a b) cho biết
các quả ở vị trí a, a+1, ..., b là các quả thuộc cùng một trong hai phần bánh. Nếu
không tìm đợc cách chia thì ghi số 0.
Ví dụ:


CAKE.INP
CAKE.OUT
CAKE.INP
CAKE.OUT
6
3 5
5
0
DSSSDS
DSDDS
Câu 2: (3,5 điểm) Mã hoá xâu nhị phân (tên file bài làm BINCODE.PAS)
Ngời ta mã hoá một xâu nhị phân gồm các ký tự 0 và 1 nh sau : Với một xâu nhị
phân S, mã hoá của nó là một mảng T chứa các số nguyên không âm sao cho T[1]
bằng 0 hoặc bằng 1 tuỳ theo ký tự đầu tiên của S là 0 hay 1. Nếu T[1]=0 thì tính từ
trái sang phải của xâu S, lần lợt T[2] bằng số ký tự 0 liên tiếp, T[3] bằng số ký tự 1
liên tiếp, T[4] bằng số ký tự 0 liên tiếp... cho đến hết xâu S.
Yêu cầu: Cho một xâu nhị phân S, hãy xác định mảng T theo cách mã hoá trên.
Dữ liệu vào: Cho trong file văn bản BINCODE.INP, có cấu trúc nh sau:
Dòng 1: Ghi số N là số lợng xâu nhị phân cần mã hoá (1 N 100).
N dòng tiếp theo: Mỗi dòng ghi một xâu nhị phân S (1 length(S) 100).
Dữ liệu ra: Ghi ra file văn bản BINCODE.OUT, theo cấu trúc nh sau:
N dòng: Mỗi dòng ghi mảng T là kết quả mã hoá của xâu nhị phân tơng ứng.
Các số trên cùng một dòng đợc ghi cách nhau một dấu cách.

1


Ví dụ:
BINCODE.INP
2

0001111100111
10001111100111

BINCODE.OUT
0 3 5 2 3
1 1 3 5 2 3

Câu 3: (3,5 điểm) Hình chữ nhật
(tên file bài làm: HCN.PAS)
Cho N hình chữ nhật trên mặt phẳng toạ độ sao cho các cạnh song song với các
trục toạ độ. Các hình chữ nhật đợc đánh số từ 1..N. Hình chữ nhật i đợc gọi là bao
hình chữ nhật j nếu cả bốn đỉnh của hình chữ nhật j đều nằm trong hoặc nằm trên
các cạnh của hình chữ nhật i.
Yêu cầu: Tìm dãy các hình chữ nhật bao nhau sao cho số lợng các hình bao
nhau lớn nhất.
Dữ liệu vào: Cho trong file văn bản HCN.INP, có cấu trúc nh sau:
Dòng 1: Ghi số nguyên N, là số lợng hình chữ nhật (1 N 1000).
N dòng tiếp theo: Mỗi dòng ghi bốn số nguyên x1, y1, x2, y2 lần lợt là hoành độ,
tung độ của các đỉnh trái trên, phải dới của một hình chữ nhật (-10000 < x 1 , y1, x2,
y2 < 10000)
Dữ liệu ra: Ghi ra file văn bản HCN.OUT, theo cấu trúc nh sau :
Dòng 1: Ghi số nguyên k là số lợng các hình chữ nhật bao nhau lớn nhất tìm đợc.
Ví dụ:
HCN.INP
HCN.OUT
6
2
1 5 2 2
2 4 3 3
1 5 5 2

4 3 8 1
5 6 8 4
6 6 8 5
Hết

2


Hớng dẫn chấm
đề thi chính thức học sinh giỏi lớp 12 - vòng 2
năm học 2006-2007
I/ Phơng pháp chung
- Giám khảo tạo các bộ dữ liệu vào, tính toán kết quả. Chạy 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 ý để tính kết quả của dữ liệu vào:
CAKE.PAS
BINCODE.PAS
HCN.PAS
- Chơng trình học sinh chạy đúng mỗi bộ test, giám khảo cho 0,5 điểm. Nh vậy,
nếu câu hỏi có 3,0 điểm thì giám khảo phải tạo đợc 6 bộ test.
- Nếu chơng trình chạy sai test nào thì giám khảo cho 0 điểm đối với test đó.
- Bài toán có thể có nhiều kết quả đúng, nếu kết quả của học sinh khác với đáp
án nhng vẫn đúng thì giám khảo vẫn cho điểm tối đa.
II/ Chơng trình gợi ý:
Câu 1: CAKE.PAS
{$r+}
Const fi='Cake.INP';
fo='Cake.OUT';
Var A:String;
N:Byte;

f:Text;
Procedure Read_file;
Begin
Assign(f,fi);
Reset(f);
Readln(f,n);
Read(f,A);
Close(f);
End;
Procedure Xuli;
Var i,sd,d,j,n1:Byte;
st:String;
Begin
If n mod 2 = 1 then Begin Writeln(f,0); Close(f); Halt; End;
d:=0;
For i:=1 to n do
If A[i]='D' then Inc(d);
If d mod 2 = 1 then Begin Writeln(f,0); Close(f); Halt; End;
n1:=n div 2;
For i:=1 to n1 do
Begin
sd:=0;
st:=copy(a,i,n1);
For j:=1 to n1 do
If st[j]='D' then Inc(sd);
If sd=(d div 2) then Begin Write(f,i,' ',i+n1-1); Close(f); Halt;
End;
End;
End;
Begin

Read_file;
Assign(f,fo);
Rewrite(f);
Xuli;
Close(f);
End.

3


C©u 2 : BINCODE.PAS
program
const

bincode;
fi='bincode.inp';
fo='bincode.out';
type mmcs=array[1..100] of string;
var f:text;
a:mmcs;
n:word;
procedure doc;
var i:word;
begin
assign(f,fi); reset(f);
readln(f,n);
for i:=1 to n do readln(f,a[i]);
close(f)
end;
procedure xl;

var i,j,x:word; st,s1:string;
begin
assign(f,fo);rewrite(f);
for i:=1 to n do
begin
st:=a[i];
while st[1]=' ' do delete(st,1,1);
while st[length(st)]=' ' do delete(st,length(st),1);
write(f,st[1],' ');
while st<>'' do
begin
if st[1]='1' then
begin
x:=pos('0',st);
if x<>0 then s1:=copy(st,1,x-1)
else begin s1:=st;x:=length(st)+1;end;
delete(st,1,x-1);
write(f,length(s1),' ');
end;
if st[1]='0' then
begin
x:=pos('1',st);
if x<>0 then s1:=copy(st,1,x-1)
else begin s1:=st;x:=length(st)+1;end;
delete(st,1,x-1);
write(f,length(s1),' ');
end;
end;
writeln(f);
end;

close(f);
end;
begin
doc;
xl;
end.

C©u 3: HCN.PAS

{$R+,Q+,S+}
const INP ='hcn.inp';
OUT ='hcn.out';
MAX = 1000;
var x1,y1,x2,y2,kq :array [1..MAX] of integer;
n : integer;
fi,fo : text;
procedure input;
var i : integer;

4


begin
assign(fi,INP); reset(fi);
read(fi,n);
for i := 1 to n do read(fi,x1[i],y1[i],x2[i],y2[i]);
close(fi);
end;
function area(i : integer) : longint;
begin

area:=longint(abs(x1[i]-x2[i]))*longint(abs(y1[i]-y2[i]));
end;
procedure qsort(l,r : integer);
var i, j, mid, t : integer;
begin
mid := (1 + r) div 2;
i := 1; j:= r;
repeat
while area(i) < area(mid) do inc(i);
while area(j) > area(mid) do dec(j);
if i <= j then
begin
t := x1[i]; x1[i] := x1[j]; x1[j] := t;
t := x2[i]; x2[i] := x2[j]; x2[j] := t;
t := y1[i]; y1[i] := y1[j]; y1[j] :=t;
t := y2[i]; y2[i] := y2[j]; y2[j] :=t;
inc(i); dec(j);
end;
until i > j;
if i < r then qsort(1,j);
end;
function bao(i,j : integer) : integer;
begin
if (x1[i]<= x1[j])and(y1[i]>= y1[j])and(x2[i]>= x2[j])and (y2[i] <= y2[j])
then bao := 1
else bao := 0;
End;
procedure progress;
var i, j : integer;
begin

for i := 1 to n do kq[i] := 1;
for i := 2 to n do
for j := 1 to i-1 do
if (bao(i,j) = 1) then
kq[i] := kq[j] + 1;
end;
procedure output;
var i, tmp : integer;
begin
tmp := 0;
for i := 1 to n do
if kq[i] > tmp then tmp := kq[i];
{if tmp = 1 then tmp := -1;}
assign(fo,OUT); rewrite(fo);
writeln(fo,tmp);
close(fo);
end;
begin
input;
qsort(1,n);
progress;
output;
end.

HÕt
5




×