Cod sursa(job #47162)

Utilizator cheery_g1rlHaller Emanuela cheery_g1rl Data 3 aprilie 2007 13:19:27
Problema Barman Scor 0
Compilator fpc Status done
Runda Arhiva de probleme Marime 1.55 kb
type vector=array[1..600] of longint;

var v,o:vector;
    f,g:text;
    k,j,ss,d,n,i,min,c:integer;
    r:longint;
    s:array[1..600] of integer;
procedure quick(ss,d:integer);
      var aux,a,b,ia:integer;
     begin
       a:=ss; b:=d;
       repeat
         while o[a]<o[b] do dec(b);
          aux:=o[a]; o[a]:=o[b]; o[b]:=aux;
          inc(a); ia:=1;
          if b>a then
             begin
               while o[a]<o[b] do inc(a);
               aux:=o[a]; o[a]:=o[b]; o[b]:=aux;
               dec(b); ia:=0;
             end;
       until b<=a;
       if ss<a-ia then quick(ss,a-ia);
       if a-ia+1<d then quick(a-ia+1,d);
     end;
procedure permut(var o:vector);
    var q,w:longint;
    begin
       w:=o[1];
      for q:=1 to n-1 do o[q]:=o[q+1];
      o[n]:=w;
    end;

begin
assign(f,'barman.in');
reset(f);
readln(f,n);
for i:=1 to n do begin read(f,v[i]); o[i]:=v[i];end;
close(f);
quick(1,n);
min:=32000;
for i:=1 to n do
  begin
    j:=1;
    c:=0;
    fillchar(s,sizeof(s),0);
    while j<=n do
      begin
        while (v[j]=o[j])and(j<=n) do inc(j);
        if v[j]<>o[j] then
           begin
             k:=j;
             while ((k<n)and((v[k]=o[k])or(v[j]<>o[k])or(o[j]<>v[k])))or(s[k]=1) do
                inc(k);
             if (k<=n)and(s[k]=0) then c:=c+40+k-j;
             s[k]:=1;
             s[j]:=1;
             inc(j);
           end;
      end;
    permut(o);
    if (c<min)and(c<>0) then min:=c;
  end;
assign(g,'barman.out'); rewrite(g); writeln(g,min); close(g);
end.