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

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

Tải bản đầy đủ - 17trang

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

(0
N 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 max
Begin

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

(5
N 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

(0
Li 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

(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 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 i
end;

function qt(i:integer):integer;

begin

if i>1 then qt:=i-1 else qt:=n;

end;

procedure vitribandau;

begin

while d2-d1
begin

d2:=d2+d[t];

inc(t);

if t=n+1 then t:=1;

end;

p:=qt(t);

end;

procedure vitrisangphai;

begin

while d2-d1
begin

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 ti
begin

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 max
Begin

Max:=a[i];

V:=i;

End;



Tài liệu bạn tìm kiếm đã sẵn sàng tải về

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

Tải bản đầy đủ ngay(17 tr)

×