p1420.pas

来自「高手写的所有acm例程 在acm.zju.edu.cn 上的题目的例程」· PAS 代码 · 共 113 行

PAS
113
字号
PROGRAM p1420;

CONST
        infinity=60000;

VAR
        num,s,r                 :array[-1..23]of Longint;
        n,part                  :Longint;

PROCEDURE Readin;
var
        i,a                     :Longint;
begin
for i:=0 to 23 do read(num[i]);
readln;
readln(n);
fillchar(r,sizeof(r),0);
for i:=1 to n do
        begin
        readln(a);
        inc(R[a]);
        end;
end;

FUNCTION check(v:Longint):Boolean;
var
        be                      :Boolean;
        i,j,min                 :Longint;
begin
check:=false;
for i:=0 to 23 do s[i]:=infinity;
s[23]:=v;
for j:=1 to 23 do
        begin
        be:=false;
        if s[0]>r[0] then
                begin
                s[0]:=r[0];
                be:=true;
                end;
        for I:=23 downto 8 do
                if (s[i-8]-s[i]>-num[i])and(abs(s[i]-num[i])<infinity) then
                        begin
                        s[i-8]:=s[i]-num[i];
                        be:=true;
                        end;
        for i:=0 to 7 do
                if (s[i+16]-s[i]>v-num[i])and(abs(s[i]+v-num[i])<infinity) then
                        begin
                        s[i+16]:=s[i]+v-num[i];
                        be:=true;
                        end;
        for i:=23 downto 1 do
                if (s[i-1]-s[i]>0)and(abs(s[i])<infinity) then
                        begin
                        s[i-1]:=s[i];
                        be:=true;
                        end;
        for i:=23 downto 1 do
                if (s[i]-s[i-1]>r[i])and(abs(s[i-1]+r[i])<infinity) then
                        begin
                        s[i]:=s[i-1]+r[i];
                        be:=true;
                        end;
        if not be then break;
        end;

if s[23]<>v then exit;
if s[0]>r[0] then exit;
for i:=23 downto 8 do
        if (s[i-8]-s[i]>-num[i]) then exit;
for i:=0 to 7 do
        if (s[i+16]-s[i]>v-num[i]) then exit;
for i:=23 downto 1 do
        if (s[i-1]-s[i]>0) then exit;
for i:=23 downto 1 do
        if s[i]-s[i-1]>r[i] then exit;

check:=true;
end;

PROCEDURE Main;
var
        ans                     :Boolean;
        i                       :Longint;
        left,right,mid          :Longint;
begin
left:=0;
right:=n;
while (left<right) do
        begin
        mid:=(left+right) div 2;
        if check(mid) then
                begin
                right:=mid;
                end else left:=mid+1;
        end;
if check(left) then writeln(left)
else if check(right) then writeln(right)
        else writeln('No Solution');
end;

BEGIN
//assign(input,'p.in');
//reset(input);
readln(part);
for part:=part downto 1 do
        begin
        Readin;
        Main;
        end;
END.

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?