Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

Re:为什么在I和J间要建在(I+J)/2这个点?我用的是(dist[i]+dist[j])/2,再找和这个中点最近的饭店为什么就wa?

Posted by The_Dawn at 2011-08-07 22:32:42 on Problem 1485
In Reply To:为什么在I和J间要建在(I+J)/2这个点?我用的是(dist[i]+dist[j])/2,再找和这个中点最近的饭店为什么就wa? Posted by:The_Dawn at 2011-08-07 22:31:08
把中间注释掉的部分用tmp:=(i+j)div 2换掉就对了。
求原因!!


var
  n,m,i,j,k,maxn,tmp,mid,minn,ans,chain:longint;
  d:array[0..201]of longint;
  f:array[0..201,0..31]of longint;
  link,cost,depot:array[0..201,0..201]of longint;

procedure renew_init;
  begin
    ans:=0;
    inc(chain);
    fillchar(link,sizeof(link),0);
    fillchar(f,sizeof(f),0);
    fillchar(cost,sizeof(cost),0);
    fillchar(depot,sizeof(depot),0);
    read(n,m);
    if n+m=0 then halt;
    for i:=1 to n do read(d[i]);
  end;

procedure prework;
  begin
    for i:=1 to n-1 do
      for j:=i+1 to n do
        begin
          {minn:=maxlongint;
          mid:=(d[i]+d[j])div 2;
          for k:=i to j do if abs(d[k]-mid)<minn then
            begin
              minn:=abs(d[k]-mid);
              tmp:=k;
            end;}
          tmp:=(i+j)div 2;
          depot[i,j]:=tmp;
          for k:=i to j do inc(cost[i,j],abs(d[k]-d[tmp]));
        end;
    for i:=1 to n do depot[i,i]:=i;
  end;

procedure dawn;
  begin
    for i:=0 to n do
      for j:=0 to m do f[i,j]:=maxlongint div 10;
    f[0,0]:=0;
    for i:=1 to n do
      for j:=1 to m do
        if j<=i then
          begin
            minn:=maxlongint;
            for k:=j-1 to i-1 do
              if f[k,j-1]+cost[k+1,i]<minn then
                begin
                  minn:=f[k,j-1]+cost[k+1,i];
                  link[i,j]:=k;
                end;
            f[i,j]:=minn;
          end;
  end;

procedure print(n,m:longint);
  begin
    if n=0 then exit;
    print(link[n,m],m-1);
    if link[n,m]=n-1 then writeln('Depot ',m,' at restaurant ',depot[link[n,m]+1,n],' serves restaurant ',n)
    else writeln('Depot ',m,' at restaurant ',depot[link[n,m]+1,n],' serves restaurants ',link[n,m]+1,' to ',n);
    inc(ans,cost[link[n,m]+1,n]);
  end;

begin
  repeat
    renew_init;
    writeln('Chain ',chain);
    prework;
    dawn;
    print(n,m);
    writeln('Total distance sum = ',ans);
    writeln;
  until false;
end.


Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator