回 帖 发 新 帖 刷新版面

主题:[讨论]轮渡问题及参考程序

轮渡(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.

回复列表 (共2个回复)

沙发

问题是什么?
程序如果有错误请说明具体的数据。
谢谢。

板凳


没什么问题,就是想跟大家交流下这个题的解法,希望能得到大家的指点。

我来回复

您尚未登录,请登录后再回复。点此登录或注册