题目大意
Tehran 的一家每天24 小时营业的超市,需要一批出纳员来满足它的需要。超市经理雇佣你来帮他解决他的问题——超市在每天的不同时段需要不同数目的出纳员(例如:午夜时只需一小批,而下午则需要很多)来为顾客提供优质服务。他希望雇佣最少数目的出纳员。经理已经提供你一天的每一小时需要出纳员的最少数量——R(0), R(1), …, R(23)。
R(0)表示从午夜到上午1:00 需要出纳员的最少数目,R(1)表示上午1:00 到2:00之间需要的,等等。每一天,这些数据都是相同的。有N 人申请这项工作,每个申请者I在没24 小时中,从一个特定的时始开始连续工作恰好8 小时,定义tI (0 <= tI <=23)为上面提到的开始时刻。也就是说,如果第I 个申请者被录取,他(她)将从tI 时刻开始连续工作8 小时。
你将编写一个程序,输入R(I)(I = 0..23)和tI (I = 1..N),它们都是非负整数,计算为满足上述限制需要雇佣的最少出纳员数目。在每一时刻可以有比对应的R(I)更多的出纳员在工作。
输入
输入文件的第一行为测试点个数(<= 20)。每组测试数据的第一行为24 个整数表示R(0),R(1),…, R(23)(R(I)<= 1000)。接下来一行是N,表示申请者数目(0 <= N <= 1000),接下来每行包含一个整数tI (0 <= tI <= 23)。两组测试数据之间没有空行。
输出
对于每个测试点,输出只有一行,包含一个整数,表示需要出纳员的最少数目。如果无解,你应当输出“No Solution”。
分析
调了一个上午,发现只是flaj打成了flag
立的一手好flag
我们的资料和这位是一样的——点一下
code
const
maxe=600;
maxv=15000;
type
arr=record
x,y,w,next:longint;
end;
var
n,m,s:longint;
nm:longint;
a:array[0..maxv] of arr;
d:array[0..maxe] of int64;
v1:array[0..maxe] of longint;
ls:array[0..maxe] of longint;
stick:array[0..maxv] of longint;
head,tail:longint;
x,y,w:array[0..30] of longint;
i,j,k:longint;
flag:boolean;
flaj:array[0..maxe] of longint;
max:longint;
t:longint;
fff:boolean;
procedure relax(u,v,w:longint);
begin
if d[u]+w>d[v] then
begin
d[v]:=d[u]+w;
if v1[v]=0
then begin
head:=head+1;
stick[head]:=v;
flaj[v]:=flaj[v]+1;
v1[v]:=1;
end;
end;
end;
procedure spfa;
var
i,j:longint;
begin
for i:=0 to 30 do
d[i]:=-maxlongint;
fillchar(stick,sizeof(stick),0);
fillchar(flaj,sizeof(flaj),0);
fillchar(v1,sizeof(v1),0);
flag:=false;
head:=1;
stick[head]:=0;
d[0]:=0;
v1[0]:=1;
repeat
j:=stick[head];
i:=ls[stick[head]];
head:=head-1;
while i<>0 do
with a[i] do
begin
relax(x,y,w);
if flaj[y]>30 then
begin
flag:=true;
exit;
end;
i:=next;
end;
v1[j]:=0;
until head=0;
end;
procedure add(x,y,w:longint);
begin
nm:=nm+1;
a[nm].x:=x;
a[nm].y:=y;
a[nm].w:=w;
a[nm].next:=ls[x];
ls[x]:=nm;
end;
procedure init;
var
i,j,k:longint;
begin
fillchar(x,sizeof(x),0);
fillchar(y,sizeof(y),0);
for i:=1 to 30 do
d[i]:=maxlongint;
for i:=1 to 24 do
read(x[i]);
readln;
readln(n);
for i:=1 to n do
begin
readln(k);
k:=k+1;
y[k]:=y[k]+1;
end;
end;
begin
readln(t);
while t<>0 do
begin
init;
fff:=true;
for max:=0 to n do
begin
fillchar(a,sizeof(a),0);
fillchar(ls,sizeof(ls),0);
nm:=0;
add(0,24,max);
for i:=1 to 24 do
begin
add(i-1,i,0);
add(i,i-1,-y[i]);
end;
for i:=1 to 8 do
add(i+16,i,(x[i]-max));
for i:=9 to 24 do
add(i-8,i,x[i]);
m:=nm;
spfa;
if (d[24]=max)
then begin
fff:=false;
writeln(max);
break;
end;
end;
if fff
then writeln('No Solution');
t:=t-1;
end;
end.