Trờng THPT Chuyên Quảng Bình Kỳ thi chọn học sinh giỏi quốc gia Lớp 12 THPT năm học 2006-2007 Đề thi đề nghị môn Tin học-Bảng B Thời gian: 180 phút Không kể thời gian giao đề Tổng quan b
Trang 1Trờng THPT Chuyên Quảng Bình Kỳ thi chọn học sinh giỏi quốc gia
Lớp 12 THPT năm học 2006-2007
Đề thi đề nghị
môn Tin học-Bảng B
Thời gian: 180 phút (Không kể thời gian giao đề)
Tổng quan bài thi
Bài 1 Tìm vị trí đặt cây xăng CAYXANG.PAS CAYXANG.INP CAYXANG.OUT Bài 2 Vận tải hàng hóa VANTAI.PAS VANTAI.INP VANTAI.OUT
Bài 1: Tìm vị trí đặt cây xăng (10 điểm) CAYXANG.PAS
Trên một hòn đảo có rất đông dân c, ngời ta xây một con đờng cao tốc chạy vòng quanh đảo Để phục vụ xăng cho xe cộ chạy trên đờng cao tốc đó, chi cục xăng dầu quyết định đặt N cây xăng trong đó có một cây xăng làm trạm trung tâm để tiếp xăng cho các cây xăng còn lại
Khoảng cách giữa cây xăng thứ i với cây xăng thứ i+1 là Di, khoảng cách từ cây xăng thứ n đến cây xăng thứ 1 là Dn Sau khi thống kê và tính toán ngời ta thấy tại địa
điểm đặt cây xăng i có nhu cầu tiêu thụ L (lít/ngày) và chi phí trung bình để vận chuyển
1 lít xăng trên 1 km là C đồng
Yêu cầu: Hãy tìm một trong N vị trí để đặt trạm xăng trung tâm sao cho tổng chi phí
chuyên chở xăng (S) trong một ngày từ trạm trung tâm đến các cây xăng là bé nhất Giả
sử xăng ở trạm trung tâm luôn luôn đủ để cung cấp cho tất cả các cây xăng.
Dữ liệu vào: Cho trong file văn bản CAYXANG.INP có cấu trúc nh sau:
Dòng 1: Chứa số nguyên dơng N là số lợng vị trí sẽ đặt cây xăng (6<=N<=10.000)
Dòng 2: Chứa số dơng C, là chi phí chuyên chở một lít xăng trên 1 km.
xăng mỗi ngày tại cây xăng thứ i và Di là khoảng cách từ cây xăng thứ i đến cây xăng thứ i+1 Các số ghi cách nhau ít nhất một dấu cách
(0<=Li<=1000; 0<Di<=50.000; 0 < (Di) <= 1.000.000)
Dữ liệu ra: Ghi ra file văn bản CAYXANG.OUT theo cấu trúc nh sau:
Dòng 1: Ghi số S là tổng chi phí nhỏ nhất tìm đợc để chuyên chở xăng trong một ngày từ
trạm trung tâm đến các cây xăng.
Ví dụ:
10 1
1 1
3 2
1 3
1 4
1000 100
1 2
2 3
2 888
1 1
783
Trang 21 100
Một công ty vận tải có rất nhiều xe (Vô hạn) Các xe đều có trọng tải rất lớn (Vô cùng lớn) Có N thành phố, giữa các thành phố có các con đờng 2 chiều nối với nhau đợc biểu biễn bởi ma trận C[i,j].
+C[i,j]=C[j,i];
+C[i,j]=0 nếu không có đờng từ thành phố i đến thành phố j.
+C[i,j]<>0 nếu có đờng từ thành phố i đến thành phố j và con đờng này chịu đợc trọng tải là C[i,j]
Ban Giám đốc công ty vận tải nhận đợc đơn đặt hàng vận chuyển hàng hoá từ thành phố X đến thành phố Y Khối lợng phải chuyên chở là P Giải sử ban đầu hàng và
xe đợc tập trung tại thành phố X.
Yêu cầu: Tìm một đờng đi từ X->Y sao cho số xe mà công ty cần phải điều động là ít
nhất Mỗi xe chỉ đợc điều động 1 lần.
Dữ liệu vào: Cho trong file VANTAI.INP, có cấu trúc nh sau:
Dòng 1: Chứa số K là số test (1<=K<=10)
K nhóm dòng tiếp theo
+Dòng đầu: Chứa các số N X Y P (2<=N<=200; 1<=P<=10.000; X<>Y) +N dòng tiếp theo: Mỗi dòng ghi N số C[i,j] (0<=C[i,j]<=200).
Dữ liệu ra: Ghi ra file VANTAI.OUT, theo cấu trúc nh sau:
K dòng: Mỗi dòng ghi một số nguyên M, là số xe điều động tơng ứng với test Nếu
không có cách điều động thì ghi -1.
Ví dụ:
VANTAI.INP VANTAI.OUT 1
3 1 2 1
0 1 0
1 0 0
0 0 0
1
Lớp 12 THPT năm học 2006-2007
ĐáP áN cho Đề thi đề nghị
môn Tin học-Bảng B
Thời gian: 180 phút (Không kể thời gian giao đề)
Tổng quan bài thi
Bài 1 Tìm vị trí đặt cây xăng CAYXANG.PAS CAYXANG.INP CAYXANG.OUT Bài 2 Vận tải hàng hóa VANTAI.PAS VANTAI.INP VANTAI.OUT
I-Chơng trình đề nghị
Bài 1:
{$A+,B-,D+,E+,F-,G-,I+,L+,N+,O-,P-,Q+,R+,S+,T-,V+,X+}
const
fi='cayxang.inp';
Trang 3fo='cayxang.out';
var f: text;
n,t,p: integer;
vong: longint;
slt,slp,min,gia,tien,tongnc,nuavong,d1,d2,ld1: comp; nc: array[1 10000]of integer;
d : array[1 10000]of longint;
procedure nhap;
var i:integer;
begin
assign(f,fi);
reset(f);
readln(f,n);
readln(f,gia);
for i:=1 to n do readln(f,nc[i],d[i]);
close(f);
end;
function phai(i:integer):integer;
begin
if i<n then phai:=i+1
else phai:=1;
end;
function trai(i:integer):integer;
begin
if i>1 then trai:=i-1
else trai:=n;
end;
procedure vitritraiphaidau;
begin
while d2-d1<nuavong do
begin
d2:=d2+d[t];
inc(t);
if t=n+1 then t:=1;
end;
p:=trai(t);
end;
procedure vitrisangphai;
begin
while d2-d1<nuavong do
begin
slp:=slp+nc[t];
slt:=slt-nc[t];
tien:=tien-(vong-d2+ld1)*nc[t];
tien:=tien+(d2-ld1)*nc[t];
d2:=d2+d[t];
inc(t);
if t=n+1 then t:=1;
end;
Trang 4procedure chuanbi;
var i:integer;
dd:longint;
begin
for i:=1 to n do tongnc:=tongnc+nc[i]; for i:=1 to n do vong:=vong+d[i]; nuavong:=vong div 2+vong mod 2; t:=1;
vitritraiphaidau;
i:=1;
dd:=0;
while i<>t do
begin
slp:=slp+nc[i];
tien:=tien+dd*nc[i];
dd:=dd+d[i];
i:=phai(i);
end;
dd:=0;
i:=1;
while i<>p do
begin
if i<>1 then slt:=slt+nc[i];
tien:=tien+dd*nc[i];
i:=trai(i);
dd:=dd+d[i];
end;
min:=tien;
end;
procedure xuly;
var i,dd:integer;
begin
for i:=2 to n do
begin
ld1:=d1;
d1:=d1+d[i-1];
slt:=slt+nc[i-1];
slp:=slp-nc[i-1];
vitrisangphai;
tien:=tien+slt*d[i-1]-slp*d[i-1];
if tien<min then min:=tien;
end;
end;
procedure inkq;
begin
assign(f,fo); rewrite(f);
writeln(f,gia*min:0:0);
close(f);
Trang 5BEGIN
nhap;
chuanbi;
xuly;
inkq;
END
Bµi 2:
{OK19:26pm 11/26/2006 }
Program Van_tai;
Const
fi='Vantai.in2';
fo='vantai.ou2';
Type
ii=integer; li=longint; bb=byte; bo=boolean; mt=array[0 201,0 201] of bb;
mmc=array[0 1001] of bb;
mmc1=array[0 201] of bo;
Var
c:mt; q:mmc; b:mmc1;
n,source,target,p,Kq,max,kk:ii;
time:li;
f,g:text;
Procedure XuLy; Forward;
Procedure DocF;
var
i,j,k:ii;
begin
assign(f,fi);
reset(f);
readln(f,kk);
for k:=1 to kk do
begin
readln(f,n,source,target,p);
max:=0;
for i:=1 to n do
begin
for j:=1 to n do
begin
read(f,c[i,j]);
if max<c[i,j] then max:=c[i,j];
end;
readln(f);
end;
Kq:=0;
XuLy;
end;
end;
Trang 6Function ThongQua(x:ii):bo;
var dau,cuoi,i,j,y:ii;
begin
fillchar(b,sizeof(b),true);
ThongQua:=false;
dau:=1;
cuoi:=1;
Q[1]:=source;
b[source]:=false;
while dau<=cuoi do
begin
y:=Q[dau];
for i:=1 to n do
if b[i] and (C[q[dau],i]>=x) then begin
if i=target then
begin
ThongQua:=true;
Exit;
end;
inc(cuoi);
Q[cuoi]:=i;
b[i]:=false;
end;
inc(dau);
end;
end;
Procedure NhiPhan(l,r:ii);
var
mid:ii;
begin
if l<=r then
begin
mid:=(l+r) div 2;
if ThongQua(mid) then
begin
Kq:=mid;
NhiPhan(mid+1,r);
end
else Nhiphan(l,mid-1);
end;
end;
Procedure XuLy;
var
i,j:ii;
begin
Nhiphan(1,max);
if kq<>0 then writeln(g,(p-1) div kq+1)
Trang 7else writeln(g,-1)
end;
Procedure GhiF;
begin
assign(g,fo);
rewrite(g);
end;
Procedure CloseF;
begin
close(g);
close(f);
end;
Begin
time:=meml[$0:$046c];
GhiF;
DocF;
CloseF;
writeln((meml[$0:$046c]-time)/18.21:0:9);readln;
End
II-Phơng án tạo test
Bài 1:
Sinh 10 Test, trong đó 5 test có giới hạn khung dữ liệu thấp
6<=N<=1.000 0<=Li<=100 0<=Li<=1000 0<Li<=100 0<(Di) <= 1.000.000
và 5 test còn lại có giới hạn khung dữ liệu nh yêu cấu bài toán đặt ra Bài 2:
Sinh 10 Test, trong đó 5 test có giới hạn khung dữ liệu thấp
2<=N<=100 1<=P<=1000 0<=Li<=1000 0<Li<=100 0<(Di) <= 1.000.000
và 5 test còn lại có giới hạn khung dữ liệu nh yêu cấu bài toán đặt ra
Trang 8Cách chấm:
-Có 20 test, mỗi test 0.5 đ Với mỗi test nếu file VANTAI.OUT của bạn đúng K1 trong
K bộ thì sẽ đợc 0.5*K1/K điểm.
-Yêu cầu thời gian:
Chơng trình chạy trong [0,2] giây thì đợc 100% số điểm.
Chơng trình chạy trong (2,4] giây thì đợc 50% số điểm.
Chơng trình chạy trong (4,8] giây thì đợc 25% số điểm.
Còn lại bạn sẽ không có điểm.