Sở giáo dục - đào tạo thừa thiên huế
Tr ờng thpt tam giang
Kỳ thi chọn hsg thpt năm 2006 - 2007
đề thi môn: tin học lớp 12
(Thời gian: 150 phút, không kể thời gian giao đề)
thí sinh lập trình bằng pascal giải hai bài toán sau:
Bài 1: phân phối hàng.
Có N công trờng cần vật liệu thi công. Công trờng i cần cung cấp D[i]
đơn vị hàng. Hàng đợc cung cấp từ hai kho A và B. Cớc vận chuyển một đơn vị
hàng từ kho A đến công trờng i là A[i]. Cớc vận chuyển một đơn vị hàng từ kho
B đến công trờng i là B[i]. Biết rằng kho A có R đơn vị hàng và tổng số hàng
của hai kho đủ cung cấp cho N công trờng.
Yêu cầu:
Hãy phân phối hàng từ hai kho đến các công trờng sao cho tổng cớc phí
vận chuyển là ít nhất.
Dữ liệu vào:
File HANG.INP có cấu trúc nh sau:
Dòng 1:
Ghi 2 số N, R (N < 10000)
Dòng 2:
Ghi N số D[1], D[2], ... , D[N]
Dòng 3:
Ghi N số A[1], A[2], ... , A[N]
Dòng 4:
Ghi N số B[1], B[2], ... , B[N]
Dữ liệu ra:
File HANG.OUT có cấu trúc nh sau:
Dòng 1:
Ghi một số nguyên dơng là tổng chi phí vận chuyển ít nhất.
Dòng 2:
Ghi N số nguyên không âm tơng ứng số đơn vị hàng mà kho A cung cấp
cho các công trờng 1, 2, ..., N
Ví dụ:
HANG.INP HANG.OUT
7 22
3 9 7 6 11 10 8
13 17 20 9 30 10 19
25 16 22 9 30 4 11
835
3 0 7 6 6 0 0
0 9 0 0 5 10 8
Bài 2: CÂN BằNG.
Coi một Cây T với N (1 <= N <= 20000) nút đợc đánh số từ 1..N. Hai
nút hoặc là nối với nhau bởi một cạnh duy nhất hoặc không nối với nhau. Xoá
bất cứ nút nào trong cây sẽ sinh ra một rừng: rừng là một tập hợp một hoặc
nhiều cây.
Định nghĩa cân bằng của một nút là kích cỡ của cây lớn nhất trong rừng
T đợc tạo bởi bằng cách xoá nút T.
Ví dụ: cho một cây:
Xoá nút 4 tạo ra hai cây với các nút của chúng là {5} và {1, 2, 3, 6, 7}.
Cây lớn hơn trong hai cây có 5 nút, do đó cân bằng của nút 4 là năm ...
Yêu cầu:
Dữ liệu vào là một cây. Tính xem nút nào có cân bằng nhỏ nhất, nếu
nhiều nút có cùng cân bằng, hãy in ra nút có thứ tự bé nhất.
Dữ liệu vào:
File BALANCE.INP có cấu trúc nh sau:
- Dòng đầu: N
- Mỗi dòng trong N-1 dòng tiếp theo có hai số chỉ hai điểm của một cạnh
trong cây. Không có cạnh nào xuất hiện hai lần trong file, tất cả các cạnh có
trong cây đều đợc thông báo.
Dữ liệu ra:
File BALANCE.OUT có cấu trúc nh sau:
- Dòng đầu là số thứ tự của nút có cân bằng nhỏ nhất.
- Dòng tiếp là cân bằng của nút đó
Ví dụ:
BALANCE.INP BALANCE.OUT
7
2 6
1 2
1 4
4 5
3 7
3 1
1
2
------------------------- Hết -------------------------
2 1 3
6 4 7
5
- Giám thị không giải thích gì thêm.
- Các file nguồn đặt tên tơng ứng là bai1.pas, bai2.pas
ĐáP áN
Bài 1.
Program bai1;
Const fi=hang.inp;
fo=hang.out;
Type mang=array[0..10000] of integer;
Var s:real;
n,r,k,w,x,y:integer;
a,b,cs:mang;
d:^mang;
Procedure Nhap;
Var i:integer;
f:text;
Begin
assign(f,fi);
reset(f);
readln(f,n,r);
new(d);
fillchar(d^,sizeof(mang),0);
for i:=1 to n do
Begin
cs[i]:=i;
read(f,d^[i]);
End;
for i:=1 to n do read(f, a[i]);
for i:=1 to n do read(f, b[i]);
close(f);
End;
{sap xep nhanh theo chi so}
Procedure Qsort(l,r:integer);
Var i,j,mid,tg:integer;
Begin
i:=l;
j:=r;
mid:=a[cs[(l+r) div 2]]-b[cs[(l+r) div 2 ]];
repeat
while a[cs[i]]-b[cs[i]]<mid do inc(i);
while a[cs[j]]-b[cs[j]]>mid do dec(i);
if i<=j then
begin
tg:=cs[i];
cs[i]:=cs[j];
cs[j]:=tg;
inc(i);
dec(j);
end;
until i>j;
if l<j then Qsort(l,j);
if i<r then Qsort(i,r);
End;
Procedure TimK;
Var i,t:integer;
Begin
s:=0;
t:=0;
k:=0;
while t+d^[cs[k]]<r do
begin
inc(k);
t:=t+d^[cs[k]];
s:=s+a[cs[k]]*d^[cs[k]];
a[cs[k]:=-a[cs[k]];
end;
x:=r-t;
y:=d^[cs[k+1]]-(r-t);
s:=s+a[cs[k+1]]*x+b[cs[k+1]]*y;
for i:=k+2 to n do
s:=s+b[cs[i]]*d^[cs[i]];
w:=cs[k+1];
End;
Procedure Xuat;
Var i:integer;
g:text;
Begin
assign(g, fo);
rewrite(g);
writeln(g,s:0:0);
for i:=1 to w-1 do
if a[i]<0 then write(g,d^[i], ‘’) else write(g,0, ‘’);
write(g,x, ‘’);
for i:=w+1 to n do
if a[i]<0 then write(g,d^[i], ‘’) else write(g,0, ‘’);
writeln(g);
for i:=1 to w-1 do
if a[i]>0 then write(g,d^[i], ‘’) else write(g,0, ‘’);
write(g,y, ‘’);
for i:=w+1 to n do
if a[i]>0 then write(g,d^[i], ‘’) else write(g,0, ‘’);
close(g);
dispose(d);
End;
BEGIN
Nhap;
Qsort(1,n);
TimK;
Xuat;
END.
Bµi 2:
Program bai2;
Const fi= ‘BALANCE.INP’;
fo= ‘BALANCE.OUT’;
max=20000;
Type m1=array[0..max+1] of integer;
Var n:integer;
a:m1;
d,c,tr,t:^m1;
f:text;
Procedure Nhap;
Var i:integer;
Begin
new(d);
new(c);
new(tr);
new(t);
assign(f,fi);
reset(f);
readln(f,n);
for i:=1 to n-1 do readln(f,d^[i],c^[i]);
close(f);
End;
Procedure Xuat;
Var i,min:integer;
Begin
dispose(d);
dispose(c);
dispose(tr);
dispose(t);
min:=1;
for i:=2 to n do
if a[i]<a[min] then min:=i;
assign(f,fo);
rewrite(f);
writeln(f,min);
writeln(f,a[min]);