Tải bản đầy đủ
Bµi 2: xÕp hép (HOP.PAS)

Bµi 2: xÕp hép (HOP.PAS)

Tải bản đầy đủ

Hãy tìm phơng án để xếp các hộp chồng lên nhau sao cho độ cao
đạt đợc của khối hộp là lớn nhất.
Dữ liệu vào đợc cho trong file HOP.INP có cấu trúc nh sau:
Dòng 1: Số N
(0N dòng tiếp: Mỗi dòng ghi ba số nguyên dơng Ai Bi Ci là kích thớc của
mỗi hộp. (Ai, Bi, Ci <=255). Các số ghi cách nhau một dấu cách. Giả sử
số hiệu của hộp đợc đánh số từ 1 đến N theo trình tự bắt đầu cho
đến kết thúc file.
Kết quả ghi ra file HOP.OUT có cấu trúc nh sau:
Dòng 1: Ghi số M là số lợng hộp tìm đợc.
M dòng tiếp theo: Mỗi dòng ghi thông tin về một hộp theo trật tự từ đáy
lên đỉnh của khối hộp. Bao gồm bốn số Ki Ai Bi Ci. Trong đó Ki là số
hiệu của hộp đợc chọn, Ai là kích thớc đáy nhỏ, Bi là kích thớc đáy lớn, Ci
là kích thớcchiều cao. Các số ghi cách nhau một dấu cách trống.
Ví dụ:
HOP.INP
9
7 5
5
4 4
8
1 1
5
4 2
2
5 1
5
4 2
7
2 9
2
1 3
3
5 5
5
HOP.OUT
4
1 5
7
5
9 5
5
5
5 5
5
1
4 2
4
2

ĐáP áN
Bài 1: Xaucon
{$R+,Q+}
Const
Fi
=
'Xaucon.inp';
Fo =
'Xaucon.out';
Var F
:
Text;
Mang :
Array[0..10000] Of Char;
N,m,k :
Longint;
Procedure Init;
Var I,KQ : Longint;
Sla,slb,sl,d,c,l:integer;
Ch:Char;
Begin
Kq:=0;
Assign(f,fi);
Reset(f);
Readln(f,n,m,k);
Sla:=0;
Slb:=0;
Kq:=0;
D:=0;
C:=-1;
Sl:=0;
For i:=1 to n do
Begin
Read(f,ch);
C:=(c+1) mod (m+1);
Mang[c]:=ch;
Inc(sl);
If ch='A' then Inc(sla);
If sl>m then
Begin
If mang[d]='A' then
Begin
Slb:=0 ;
Dec(sla);

End
Else
If slb>0 then Dec(slb);
D:=(d+1) mod (m+1);
Dec(sl);
End;
While sla>k do
Begin
If Mang[d]='A' then
Begin
Slb:=0;
Dec(sla);
End
Else
If slb=0 then Dec(slb);
D:=(d+1) mod (m+1);
Dec(sl);
End;
If (slb=0) and (sla=k) then
Begin
L:=d;
While Mang[l]='B' do
Begin
Inc(slb);
L:=(l+1) mod (m+1);
End;
End;
If sla=k then
Inc(kq,slb+1);
End;
Close(f);
assign(f,fo);
Rewrite(f);
Writeln(kq);
Close(f);
End;
Begin
Init;
End.
Bài 2: HOP.PAS
{$M 63840,0,655360}

Const

Fi='HOP.inp';
Fo='HOP.out';
Type Mang=Array[1..3] Of Byte;
Var Vt:Array[0..5001] Of Integer;
A:Array[0..5000] Of Mang;
N:Integer; F:Text;
Procedure Doi(Var A,b:Longint);
Var T:Longint;
Begin
T:=a;
A:=b;
B:=t;
End;
Procedure Doi1(Var A,b:Integer);
Var T:Integer;
Begin
T:=a;
A:=b;
B:=t;
End;
Procedure Doi2(Var A,b:Byte);
Var T:Byte;
Begin
T:=a;
A:=b;
B:=t;
End;
Procedure Sap(Var T:Mang);
Var I,j:Integer;
Begin
For i:=1 to 2 do
For j:=i+1 to 3 do
If T[i]Doi2(t[i],t[j]);
End;
Procedure DoiM(Var a,b:Mang);
Var T:mang;
Begin
T:=a;
A:=b;
B:=t;
End;
Procedure Init;
Var S:Array[0..5001] Of Longint;
I,j:Integer;
procedure Sort(l, r: Integer);
var i, j, x: Longint;
begin
i := l; j := r; x := s[(l+r) DIV 2];
repeat
while s[i] < x do i := i + 1;
while x < S[j] do j := j - 1;

if i <= j then
begin
Doim(A[i],a[j]);
Doi(S[i],s[j]);
Doi1(vt[i],vt[j]);
i := i + 1; j := j - 1;
end;
until i > j;
if l < j then Sort(l, j);
if i < r then Sort(i, r);
end;
Begin
Assign(f,fi);
Reset(f);
Readln(f,n);
For i:=1 to n do
Begin
For j:=1 to 3 do Read(f,a[i,j]);
Sap(a[i]);
S[i]:=Longint(a[i,1])*Longint(a[i,2]);
Vt[i]:=i;
End;
Close(f);
Sort(1,n);
End;
Procedure QHD;
Var I,j,max,v,v1:Longint;
Sl,tr:Array[0..5001] Of Longint;
Begin
For i:=1 to n do Sl[i]:=A[i,3];
Fillchar(tr,sizeof(tr),0);
For i:=2 to n do
For j:=i-1 downto 1 do
If Sl[j]+Longint(A[i,3])>sl[i] then
If A[i,1]>=a[j,1] then
If A[i,2]>=a[j,2] then
Begin
Tr[i]:=j;
Sl[i]:=sl[j]+Longint(A[i,3]);
End;
Max:=A[1,3]; V:=1;
For i:=1 to n do
If maxBegin
Max:=sl[i];
V:=i;

End;
Assign(f,fo);
Rewrite(f);
V1:=v;
Max:=0;
While V1>0 do
Begin
Inc(max);
V1:=tr[v1];
End;
Writeln(f,max);
For I:=1 to max do
Begin
Writeln(f,Vt[v],' ',A[v][2],' ',a[v][1],' ',a[v][3]);
End;
Close(f);
End;
Begin
Init;
Qhd;
End.

V:=tr[v];

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/2004
Đề thi dự kiến
lớp 11
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 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à 1
đồng.
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 XANG.INP có cấu trúc nh sau:
Dòng 1: Chứa số N là số lợng vị trí sẽ đặt cây xăng
(5N dòng tiếp theo: Mỗi dòng chứa hai số nguyên Li Di cách nhau
một dấu cách
Di là khoảng cách từ cây xăng thứ i đến cây xăng thứ i+1
(0Li là khả năng tiêu thụ xăng mỗi ngày.
(Li<32768)

Dữ liệu ra: Xuất ra file văn bản XANG.OUT gồm 1 dòng ghi số S (nhỏ
nhất tìm đợc) là tổng chi phí 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ụ:
XANG.INP
10
11
32
13
14
1000 100
12
23
2 888
11
1 100
XANG.OUT
783
Bài 2: Thuê máy (THUEMAY.PAS)
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ả
0(Bi, Ti nguyên dơng)
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ê.
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 yêu cầu là khoảng
thời gian thuê của hai ngời khách bất kỳ không đợc giao nhau kể cả
điểm mút.
-Dữ liệu vào đợc cho trong file văn bản THUEMAY.INP có cấu trúc
nh sau:
Dòng 1: Ghi số N
(0N 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 trống.

-Dữ liệu ra ghi và file văn bản THUEMAY.OUT có cấu trúc nh sau:
Dòng 1: Ghi 2 số P Q cách nhau một dấu cách trống. Trong đó P là số
lợng phiếu đăng ký thuê. Q là tổng số tiền thu đợc trong P hợp đồng đã
chọn ở trên.
Dòng 2: Ghi chỉ số khách hàng mà ông chủ trung tâm sẽ đồng ý cho
thuê máy.
Ví dụ
THUEMAY.INP
3
50 300 200
30 230 100
270 350 150
THUEMAY.OUT
2 250
32

đáp án
Bài 1: XANG.PAS
{$A+,B-,D+,E+,F-,G-,I+,L+,N+,O-,P-,Q+,R+,S+,T-,V+,X+}
const
fi='XANG.INP';
fo='XANG.OUT';
var f: text; n,t,p: integer; vong: longint;
st,sp,min,ti,tongnc,nv,d1,d2,ld1: comp;
nc: array[1..10000]of integer;
d : array[1..10000]of longint;
procedure input;
var i:integer;
begin
assign(f,fi); reset(f);
readln(f,n);

for i:=1 to n do readln(f,nc[i],d[i]);
close(f);
end;
function qp(i:integer):integer;
begin
if iend;
function qt(i:integer):integer;
begin
if i>1 then qt:=i-1 else qt:=n;
end;
procedure vitribandau;
begin
while d2-d1begin
d2:=d2+d[t];
inc(t);
if t=n+1 then t:=1;
end;
p:=qt(t);
end;
procedure vitrisangphai;
begin
while d2-d1begin
sp:=sp+nc[t];
st:=st-nc[t];
ti:=ti-(vong-d2+ld1)*nc[t];
ti:=ti+(d2-ld1)*nc[t];
d2:=d2+d[t];
inc(t);
if t=n+1 then t:=1;
end;
end;
procedure init;
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];
nv:=(vong div 2)+(vong mod 2);
t:=1; vitribandau;
i:=1; dd:=0;
while i<>t do
begin
sp:=sp+nc[i];
ti:=ti+dd*nc[i];
dd:=dd+d[i];

i:=qp(i);

end;
dd:=0; i:=1;
while i<>p do
begin
if i<>1 then st:=st+nc[i];
ti:=ti+dd*nc[i];
i:=qt(i);
dd:=dd+d[i];
end;
min:=ti;
end;
procedure proce;
var i,dd:integer; il:word;
begin
for i:=2 to n do
begin
ld1:=d1;
d1:=d1+d[i-1];
st:=st+nc[i-1];
sp:=sp-nc[i-1];
vitrisangphai;
ti:=ti+st*d[i-1]-sp*d[i-1];
if tibegin
min:=ti;
il:=i;
end;
end;
end;
procedure outpu;
begin
assign(f,fo); rewrite(f);
writeln(f,min:0:0);
close(f);
end;
BEGIN
input; init; proce; outpu;
END.
Bài 2: THUEMAY.PAS
{$R+,Q+}
Const
Fi='thuemay.inp';
Fo='thuemay.out';
Var B,t,m,vt:array[0..1000] Of Longint;
N:Longint; F:Text;
Procedure Init;
Var I:Longint;
Begin
Assign(f,fi);
Reset(f);

Readln(f,n);
For i:=1 to n do
Readln(f,b[i],t[i],m[i]);
Close(f);
For i:=1 to n do Vt[i]:=i;
End;
procedure Sort(l, r: Longint);
var i, j, x, y,xx: Longint;
begin
i := l; j := r; x := B[(l+r) DIV 2]; XX:=t[(l+r) DIV 2];
repeat
while (B[i] < x) Or ((b[i]=x) and (T[i]while (x < B[j]) Or ((b[j]=x) and (T[j]>xx)) do j := j - 1;
if i <= j then
begin
y := b[i]; b[i] := b[j]; b[j] := y;
y := t[i]; t[i] := t[j]; t[j] := y;
y := m[i]; m[i] := m[j]; m[j] := y;
y := vt[i]; vt[i] := vt[j]; vt[j] := y;
i := i + 1; j := j - 1;
end;
until i > j;
if l < j then Sort(l, j);
if i < r then Sort(i, r);
end;
Procedure QHD;
Var I,j,Max,v,v1,dem:Longint;
A,tr:Array[0..1000] Of Longint;
Begin
For i:=1 to n do a[i]:=Longint(M[i]);
Fillchar(tr,sizeof(tr),0);
For i:=1 to n do
For j:=1 to i-1 do
If A[i]If B[i]>=b[j]+t[j] then
Begin
Tr[i]:=j;
A[i]:=Longint(a[j])+Longint(m[i]);
End;
Max:=a[1];
V:=1;
For i:=1 to n do
If maxBegin
Max:=a[i];
V:=i;
End;