主题:[讨论]轮渡问题及参考程序
轮渡(lundu.pas)
有一艘车轮渡往来与河的两岸,运送车辆。轮渡上最多可以装载n辆车,过河一次需要t分钟。只要河的两岸有车在等待,船就要开。即如果船当前所在的一岸有车,那么它将载车马上过河;如果这一岸没有车,但是对岸有车在等,它会空船开过去;如果两岸此时都没有车,它就“休息”。如果岸边等待的车超过n量,那么按照到达的顺序,先到的先上,超过的要等下一班。
给出两岸车到达的情况,问每一辆车到达对岸的时刻。
输入第一行是n、t和m,m表示车的数量。接下来的m行,每行第一个数表示这辆车到达的时刻,第二个字符串是left或right,表示哪一岸。0<n,t,m<=10000。船初始时在左岸。车上下船的时间假设为0。输入的时刻一定是严格递增的。
按输入顺序,给出每一辆车到达对岸的时刻。
样例:
输入:lundu.in
2 10 10
0 left
10 left
20 left
30 left
40 left
50 left
60 left
70 left
80 left
90 left
输出:lundu.out
10
30
30
50
50
70
70
90
90
110
输入
2 10 3
10 right
25 left
40 left
输出
30
40
60
参考程序:
program lundu;
var
n,t,m,n1,m1,i,bt:byte;
si:array[1..100] of string[6];
bs:string[6];
ct,rt:array[1..100] of byte;
procedure wait;
begin
for i:=2 to m do
if (ct[i]<=bt+t)and(rt[i]=0) then
begin
bt:=bt+t;
exit;
end else if ct[i]>bt+t then
begin
bt:=ct[i];
exit;
end;
end;
procedure work;
begin
for i:=1 to m do
begin
if n1=n then exit;
if ct[i]>bt then exit;
if (si[i]=bs)and(rt[i]=0) then
begin
rt[i]:=bt+t;
m1:=m1+1;
n1:=n1+1;
end;
end;
end;
{=========== main ============}
begin
assign(input,'lundu.in');
reset(input);
readln(n,t,m);
for i:=1 to m do
begin
read(ct[i]);
readln(si[i]);
end;
close(input);
if si[1]=' left' then
begin
bs:= ' left';
bt:=ct[1];
end else begin
bs:=' right';
bt:=ct[1]+t;
end;
repeat
work;
wait;
if bs=' left' then bs:=' right' else bs:=' left';
n1:=0;
until m1=m;
assign(output,'lundu.out');
rewrite(output);
for i:=1 to m do
writeln(rt[i]);
close(output);
end.
有一艘车轮渡往来与河的两岸,运送车辆。轮渡上最多可以装载n辆车,过河一次需要t分钟。只要河的两岸有车在等待,船就要开。即如果船当前所在的一岸有车,那么它将载车马上过河;如果这一岸没有车,但是对岸有车在等,它会空船开过去;如果两岸此时都没有车,它就“休息”。如果岸边等待的车超过n量,那么按照到达的顺序,先到的先上,超过的要等下一班。
给出两岸车到达的情况,问每一辆车到达对岸的时刻。
输入第一行是n、t和m,m表示车的数量。接下来的m行,每行第一个数表示这辆车到达的时刻,第二个字符串是left或right,表示哪一岸。0<n,t,m<=10000。船初始时在左岸。车上下船的时间假设为0。输入的时刻一定是严格递增的。
按输入顺序,给出每一辆车到达对岸的时刻。
样例:
输入:lundu.in
2 10 10
0 left
10 left
20 left
30 left
40 left
50 left
60 left
70 left
80 left
90 left
输出:lundu.out
10
30
30
50
50
70
70
90
90
110
输入
2 10 3
10 right
25 left
40 left
输出
30
40
60
参考程序:
program lundu;
var
n,t,m,n1,m1,i,bt:byte;
si:array[1..100] of string[6];
bs:string[6];
ct,rt:array[1..100] of byte;
procedure wait;
begin
for i:=2 to m do
if (ct[i]<=bt+t)and(rt[i]=0) then
begin
bt:=bt+t;
exit;
end else if ct[i]>bt+t then
begin
bt:=ct[i];
exit;
end;
end;
procedure work;
begin
for i:=1 to m do
begin
if n1=n then exit;
if ct[i]>bt then exit;
if (si[i]=bs)and(rt[i]=0) then
begin
rt[i]:=bt+t;
m1:=m1+1;
n1:=n1+1;
end;
end;
end;
{=========== main ============}
begin
assign(input,'lundu.in');
reset(input);
readln(n,t,m);
for i:=1 to m do
begin
read(ct[i]);
readln(si[i]);
end;
close(input);
if si[1]=' left' then
begin
bs:= ' left';
bt:=ct[1];
end else begin
bs:=' right';
bt:=ct[1]+t;
end;
repeat
work;
wait;
if bs=' left' then bs:=' right' else bs:=' left';
n1:=0;
until m1=m;
assign(output,'lundu.out');
rewrite(output);
for i:=1 to m do
writeln(rt[i]);
close(output);
end.