Cod sursa(job #1130431)

Utilizator alisa2801Ciubotaru Alisa alisa2801 Data 28 februarie 2014 13:14:14
Problema Oo Scor 0
Compilator fpc Status done
Runda Arhiva de probleme Marime 2.08 kb
type  vector=array[1..10000] of integer;
var v:vector;
    n,k,s:longint;
   ultimele:boolean;
         g:text;
Procedure citire;
var i:integer;
    f:text;
Begin
   assign(f,'oo.in'); reset(f);
   readln(f,n);
   For i:=1 to n do
     read(f,v[i]);
close(f);
end;

function max2_v:integer;
var i,j,smax,k:longint;
Begin
   smax:=-maxint;  i:=1;
   while i<=n do
      Begin
      If smax<v[i]+v[i+1]  then
       Begin
          k:=i;
          smax:=v[i]+v[i+1];
        end;
      i:=i+1;
      end;

   If (smax<(v[n]+v[1])) then
     Begin
       k:=n;
       smax:=v[n]+v[1];
     end;
max2_v:=k;
end;

procedure modif(k:longint;var v:vector);
Begin
   If (k<>n)and (k<>1) then
     Begin
         v[k-1]:=-1;  {marcam cu -1 cotetul gainilor care fug}
         v[k+2]:=-1;
         v[k]:=-1;
         v[k+1]:=-1;
      end;
    If k=n then
      Begin
         v[k-1]:=-1;
         v[n]:=-1;
         v[1]:=-1;
         v[2]:=-1;
      end;
   If k=1 then
     Begin
       v[1]:=-1;
       v[n]:=-1;
       v[2]:=-1;
       v[3]:=-1;
     end;
end;

function oprire(v:vector):boolean; { daca gasim k astfel incat v[k] sau v[k+1]=-1 se opreste}
var i:longint;

Begin
    oprire:=true;  ultimele:=false; i:=0;
 While i<=n-1 do
  Begin  i:=i+1;
     If (v[i]<>-1) and (v[i+1]<>-1) then
        oprire:=false;   {mai exista 2 posib}
   end;
  If (oprire=true) and ((v[n]<>-1) and (v[1]<>-1)) then {daca nu se mai pot aduna
 simultan de pe 2 alaturatept ca v[i] sau v[i+1]=-1, atunci comparam si primul cu ultimul}
    Begin
              ultimele:=true;
     end;
end;

procedure oo;
var i,j:longint;
Begin

 while oprire(v)=false do
  Begin
    k:=max2_v;
    If (k<>n) and (k<>1) then
     s:=s+v[k]+v[k+1]
    else
  If k=n then
    s:=s+v[n]+v[1]
  else
  If k=1 then
     s:=s+v[1]+v[2];
  modif(k,v);
  end;

  If (oprire(v)=true ) and (ultimele=true) then
   Begin
   s:=s+v[n]+v[i];
    v[n]:=-1; v[1]:=-1;
   end;
end;

BEGIN
  citire;
  oo;
  assign(g,'oo.out');rewrite(g);
  write(g,s);
close(g);
END.