SỞ GIÁO DỤC VÀ ĐÀO TẠO TỈNH QUẢNG BÌNH
TRƯỜNG THPT CHUYÊN QUẢNG BÌNH
KỲ THI OLIMPIC TIN HỌC 30/04/2006
ĐỀ THI ĐỀ XUẤT
LỚP 11
Bài 1: Đếm số xâu con:
XAUCON.PAS
(5/10 điểm)
Cho một xâu X có chiều dài N ký tự. Xâu chỉ gồm hai loại ký tự ‘A’ và ‘B’. Một xâu
Y được gọi là xâu con của X nếu thoả mãn các tính chất sau:
+ Y là một đoạn ký tự liên tiếp của xâu X.
+ Có chiều dài L<= M
(M cho trước)
+ Có K ký tự ‘A’
Ví dụ: X là: BABABAABBB
Với M=5 và K=3 thì xâu ABAA là một xâu con.
Yêu cầu:
Hãy tìm số lượng xâu con của xâu X.
Dữ liệu vào: Cho trong file văn bản XAUCON.INP có cấu trúc:
Dòng 1: Chứa 3 số N M K (0 < N <= 1000000; 0 < L<= M <= 14; 0 < K <= M)
Trong đó: N là độ dài của xâu X, M là chiều dài lớn nhất của các xâu con Y, K là số lượng
ký tự ‘A’. Các số ghi cách nhau ít nhất một dấu cách.
Dòng 2: Chứa N ký tự của xâu X. Các ký tự viết liền nhau.
Dữ liệu ra: Ghi ra file văn bản có tên XAUCON.OUT theo cấu trúc:
Dòng 1: Ghi số S, là số lượng xâu con tìm được.
Ví dụ:
XAUCON.INP
30 14 4
BBABBBAAAAAABBAABBBABBABABABAB
XAUCON.OUT
41
Bài 2: Thuê máy
THUEMAY.PAS
(5/10 điểm)
Một trung tâm vi tính có một siêu máy tính có cài đầy đủ các phần mềm. Rất nhiều
khách hàng muốn thuê máy để làm việc. Tuy nhiên ông chủ trung tâm không đưa ra một
mức giá cho thuê cụ thể mà yêu cầu khách hàng tự đăng ký vào một phiếu thuê máy. Mỗi
phiếu thuê gồm có các thông tin sau:
+ Thời điểm bắt đầu thuê
Bi
+ Thời gian thuê
Ti
+ Số tiền phải trả
Mi
Hiện nay, ông chủ trung tâm đã nhận được N phiếu đăng ký thuê. Ông không nhận
thêm phiếu đăng ký nào nữa mà chỉ xem xét và chọn khách hàng để cho thuê.
Yêu cầu: Hãy giúp ông chủ trung tâm xác định cần làm hợp đồng với những khách hàng nào
sao cho số tiền thu được là lớn nhất. Với điều kiện là khoảng thời gian thuê của hai người
khách bất kỳ không được giao nhau kể cả thời điểm đầu mút.
Dữ liệu vào: Cho trong file văn bản THUEMAY.INP có cấu trúc như sau:
-Dòng 1: Ghi số N là số phiếu đăng ký thuê máy. (0
-N dòng tiếp theo: Mỗi dòng ghi 3 số Bi Ti Mi là thông tin của phiếu đăng ký của khách
hàng thứ i. Các số ghi cách nhau một dấu cách. (0
Dữ liệu ra: Ghi ra file văn bản THUEMAY.OUT theo cấu trúc như sau:
-Dòng 1: Ghi số P, là tổng số tiền lớn nhất thu được (0
Ví dụ:
THUEMAY.INP
3
50 300 200
30 230 100
270 350 150
THUEMAY.OUT
250
ĐÁP ÁN
BÀI 1: XAUCON
const
mm=14;
kk=7;
nn=1000000;
fi='xaucon.inp';
fo='xaucon.out';
type mmc=array[1..14] of longint;
var f:text;
st:string;
n,m,k,d:longint;
dem:mmc;
ti:longint;
function sl(s1:string):longint;
var i:integer;s:longint;
begin
s:=0;
for i:=1 to length(s1) do if s1[i]='A' then s:=s+1;
sl:=s;
end;
procedure xl;
var i,j:longint; c:char;
s1:string;
begin
st:='';
for i:=1 to 14 do dem[i]:=0;
assign(f,fi);
reset(f);
readln(f,n,m,k);
for i:=1 to m do
begin
read(f,c);
st:=st+c;
end;
for i:=k to m do
begin
for j:=1 to m-i+1 do
begin
s1:=copy(st,j,i);
if sl(s1)=k then dem[i]:=dem[i]+1;
end;
end;
d:=m;
repeat
read(f,c);
d:=d+1;
st:=copy(st,2,length(st)-1)+c;
for i:=m-k+1 downto 1 do
begin
s1:=copy(st,i,length(st)-i+1);
if sl(s1)=k then dem[length(st)-i+1]:=dem[length(st)-i+1]+1;
end;
until d=n;
close(f);
d:=0;
for i:=1 to m do d:=d+dem[i];
assign(f,fo);rewrite(f);
writeln(f,d);
close(f);
end;
begin
ti:=meml[0:$46c];
xl;
writeln('TG=',(meml[0:$46c]-ti)/18.2:8:4);
readln;
end.
Bài 2: THUEMAY.PAS
{$R+}
Program Thue_May;
Const
fi='Thuemay.inp';
fo='Thuemay.out';
Type
ii=integer; li=longint; bb=byte; bo=boolean;
mmc=array[0..16000] of li;
Var
a,b,c:^mmc; s:mmc;
n:li;
time:li;
f:text;
Dynamic:Pointer;
Procedure DocF;
var
i:li;
begin
Mark(Dynamic);
new(a); new(b); new(c);
assign(f,fi);
reset(f);
readln(f,n);
a^[0]:=0; b^[0]:=0; c^[0]:=0;
for i:=1 to n do
begin
read(f,a^[i],b^[i],c^[i]);
b^[i]:=a^[i]+b^[i];
end;
close(f);
end;
Procedure Sort(l,r:Integer);
var
i,j,x,y,x1:li;
begin
i:=l;
j:= r;
x :=B^[(l+r)DIV 2];
x1:=A^[(l+r)DIV 2];
repeat
while (b^[i]
while (x
if i<=j then
begin
y:=a^[i]; a^[i]:=a^[j]; a^[j]:=y;
y:=b^[i]; b^[i]:=b^[j]; b^[j]:=y;
y:=c^[i]; c^[i]:=c^[j]; c^[j]:=y;
i:=i+1; j:=j-1;
end;
until i > j;
if l
if i
end;
Function GetMax(x,y:li):li;
begin
if x>y then GetMax:=x
else GetMax:=y;
end;
Function Timkiem(l,r,x:li):li;
var
kq:li;
Procedure NhiPhan(l,r:li);
var mid:li;
begin
if l<=r then
begin
mid:=(l+r) div 2;
if b^[mid]<=x then
begin
kq:=mid;
NhiPhan(mid+1,r);
end
else NhiPhan(l,mid-1);
end;
end;
begin
Nhiphan(l,r);
Timkiem:=kq;
end;
Procedure XuLy;
var
i,j:li;
begin
fillchar(s,sizeof(s),0);
Sort(1,n);
for i:=1 to n do
begin
j:=TimKiem(0,i,a^[i]);
s[i]:=GetMax(s[i-1],s[j]+c^[i]);
end;
end;
Procedure GhiF;
begin
assign(f,fo);
rewrite(f);
writeln(f,s[n]);
close(f);
Release(Dynamic);
end;
Begin
time:=meml[$0:$046C];
DocF;
XuLy;
GhiF;
Writeln((meml[$0:$046C]-time)/18.21:0:9,' Secs');
End.