KSPREE - Triple Shoot

Tác giả: ladpro98

Ngôn ngữ: Pascal

program kspree;
uses    math;
const   maxn=30;
        fi='';
var     a,adj,stack:array[-1..maxn] of longint;
        check:array[1..maxn] of boolean;
        res,n,sum,i,d:longint;

procedure input;
var     inp:text;
        i:longint;
begin
        assign(inp,fi);reset(inp);
        readln(inp,n);
        for i:=1 to n do
        read(inp,a[i]);
        close(inp);
end;

procedure init;
var     i:longint;
begin
        sum:=0;
        for i:=1 to n do inc(sum,a[i]);
        for i:=1 to n do adj[i]:=i;
        adj[0]:=n;
        adj[-1]:=n-1;
        adj[n+1]:=1;
        adj[n+2]:=2;
        res:=high(longint);
end;

procedure back(i,dame,s:longint);
var     j,down,d:longint;
        stack:array[1..3] of longint;
begin
        if dame>=res then exit;
        down:=0;d:=0;
        for j:=i-1 to i+1 do
        if not check[adj[j]] then
        begin
                check[adj[j]]:=true;
                inc(down,a[adj[j]]);
                inc(d);
                stack[d]:=adj[j];
        end;
        if s+down=sum then
        begin
                res:=min(res,dame);
                for j:=1 to d do check[stack[j]]:=false;
                exit;
        end;
        for j:=1 to n do
        if not check[j] then
        back(j,dame+sum-down-s,s+down);
        for j:=1 to d do check[stack[j]]:=false;
end;

begin
        input;
        init;
        for i:=1 to n do
        back(i,0,0);
        write(res);
end.

Download