#3792: 同样的算法,C可以过,Pascal过不了,为何?


powerwater (龙在江湖)

學校 : 湖北省宜昌市夷陵中学
編號 : 3912
來源 : [61.136.149.114]
最後登入時間 :
2017-10-22 20:23:41
d718. Waiting In Line | From: [58.19.246.33] | 發表日期 : 2010-05-29 18:18

program d718;
type nodep=^node;
     node=record
            data:longint;
            next:nodep;
          end;
var n,i,j,k,tn,x:longint;
    c,c1:char;
    head,tail:nodep;
    belong:array[0..1000000]of longint;
    team:array[0..1000]of nodep;
procedure enqueue(x:longint);
    var p,q:nodep;
    begin
      new(q);
      q^.data:=x;
      if (team[belong[x]]<>nil) then
        begin
          p:=team[belong[x]];
          q^.next:=p^.next;
          p^.next:=q;
          if (p=tail) then tail:=q;
        end
      else begin
               tail^.next:=q;
               tail:=q;
               q^.next:=nil;
           end;
      if (belong[x]>0) then team[belong[x]]:=q;
    end;
procedure dequeue;
    var p:nodep;
        f:boolean;
    begin
        p:=head^.next;
        if (p<>nil) then
          begin
              f:=false;
              if (p^.next=nil) then f:=true
              else if belong[p^.data]<>belong[p^.next^.data] then f:=true;
              if f then team[belong[p^.data]]:=nil;
              writeln(p^.data);
              head^.next:=p^.next;
              if (p=tail) then tail:=head;
              dispose(p);
          end;
    end;
begin
    k:=0;
    new(head);
    while not eof do
      begin
          head^.next:=nil;  tail:=head;
          fillchar(team,sizeof(team),0);
          fillchar(belong,sizeof(belong),0);
          readln(n);
          for i:=1 to n do
            begin
                read(tn);
                for j:=1 to tn do
                  begin read(x);  belong[x]:=i;  end;
                readln;
            end;
          inc(k);
          writeln('Line #',k);
          read(c);
          while (true) do
            begin
              case c of
                  'S': break;
                  'E': begin for i:=1 to 6 do read(c1);
                       readln(x);  enqueue(x);   end;
                  'D': begin readln; dequeue();  end;
              end;
              read(c);
            end;
          readln;
      end;
end.
 
 
——————————————————————————
本題目共 4 個測試點,您的程式共通過 3 個測試點。(score:75)
獲得部分分數 75 分。
錯誤訊息如下:

*** 第 1 點 (25%):AC (12ms, 4.6MB)

*** 第 2 點 (25%):RE (WEXITSTATUS)
執行時發生錯誤,PASCAL 代碼(code:106)

*** 第 3 點 (25%):AC (92ms, 5.7MB)

*** 第 4 點 (25%):AC (104ms, 5.7MB)
 ——————————————————————————————
第二组测资有何不同? 请高人指出,先在此谢过
 
#3841: Re:同样的算法,C可以过,Pascal过不了,为何?


david942j (文旋)

學校 : 臺北市立成功高級中學
編號 : 6086
來源 : [115.43.75.16]
最後登入時間 :
2017-02-18 13:17:39
d718. Waiting In Line | From: [111.185.66.140] | 發表日期 : 2010-06-07 23:06

program d718;
type nodep=^node;
     node=record
            data:longint;
            next:nodep;
          end;
var n,i,j,k,tn,x:longint;
    c,c1:char;
    head,tail:nodep;
    belong:array[0..1000000]of longint;
    team:array[0..1000]of nodep;
procedure enqueue(x:longint);
    var p,q:nodep;
    begin
      new(q);
      q^.data:=x;
      if (team[belong[x]]<>nil) then
        begin
          p:=team[belong[x]];
          q^.next:=p^.next;
          p^.next:=q;
          if (p=tail) then tail:=q;
        end
      else begin
               tail^.next:=q;
               tail:=q;
               q^.next:=nil;
           end;
      if (belong[x]>0) then team[belong[x]]:=q;
    end;
procedure dequeue;
    var p:nodep;
        f:boolean;
    begin
        p:=head^.next;
        if (p<>nil) then
          begin
              f:=false;
              if (p^.next=nil) then f:=true
              else if belong[p^.data]<>belong[p^.next^.data] then f:=true;
              if f then team[belong[p^.data]]:=nil;
              writeln(p^.data);
              head^.next:=p^.next;
              if (p=tail) then tail:=head;
              dispose(p);
          end;
    end;
begin
    k:=0;
    new(head);
    while not eof do
      begin
          head^.next:=nil;  tail:=head;
          fillchar(team,sizeof(team),0);
          fillchar(belong,sizeof(belong),0);
          readln(n);
          for i:=1 to n do
            begin
                read(tn);
                for j:=1 to tn do
                  begin read(x);  belong[x]:=i;  end;
                readln;
            end;
          inc(k);
          writeln('Line #',k);
          read(c);
          while (true) do
            begin
              case c of
                  'S': break;
                  'E': begin for i:=1 to 6 do read(c1);
                       readln(x);  enqueue(x);   end;
                  'D': begin readln; dequeue();  end;
              end;
              read(c);
            end;
          readln;
      end;
end.
——————————————————————————
本題目共 4 個測試點,您的程式共通過 3 個測試點。(score:75)
獲得部分分數 75 分。
錯誤訊息如下:

*** 第 1 點 (25%):AC (12ms, 4.6MB)

*** 第 2 點 (25%):RE (WEXITSTATUS)
執行時發生錯誤,PASCAL 代碼(code:106)

*** 第 3 點 (25%):AC (92ms, 5.7MB)

*** 第 4 點 (25%):AC (104ms, 5.7MB)
 ——————————————————————————————
第二组测资有何不同? 请高人指出,先在此谢过



抱歉是測資有換行符的問題

已修改並重測

 
ZeroJudge Forum