KSPREE - Triple Shoot

Tác giả: flashmt

Ngôn ngữ: Pascal

var a,d,l,r:array[1..20] of longint;
    n,re,s,sum:longint;

procedure rf;
var i:longint;
begin
     read(n);
     for i:=1 to n do
     begin
          read(a[i]);
          sum:=sum+a[i];
          l[i]:=i-1; r[i]:=i+1;
     end;
     l[1]:=n; r[n]:=1;
end;

procedure att(x:longint);
var i,t,dem:longint; kt:boolean;
begin
     if x=n then
     begin
          if s<re then re:=s;
          exit;
     end;
     if s>=re then exit;
     for i:=1 to n do
         if (d[i]=0) and (d[l[i]]=0) then
         begin
              if d[r[i]]=0 then
              begin
                   t:=a[i]+a[l[i]]+a[r[i]];
                   dem:=3;
                   kt:=true;
              end
              else
              begin
                   t:=a[i]+a[l[i]];
                   dem:=2;
                   kt:=false;
              end;
              d[i]:=1; d[l[i]]:=1; d[r[i]]:=1;
              sum:=sum-t;
              s:=s+sum;
              att(x+dem);
              s:=s-sum;
              sum:=sum+t;
              d[i]:=0; d[l[i]]:=0;
              if kt then d[r[i]]:=0;
         end
         else
         begin
              if (d[i]=0) and (d[l[i]]=1) and (d[r[i]]=1) then
              begin
                   sum:=sum-a[i];
                   s:=s+sum;
                   d[i]:=1;
                   att(x+1);
                   d[i]:=0;
                   s:=s-sum;
                   sum:=sum+a[i];
              end;
         end;
end;

procedure pr;
begin
     re:=maxlongint; s:=0;
     att(0);
     writeln(re);
end;

begin
     rf;
     pr;
end.

Download