Cashier Employment poj 1275 差分约束系统

    xiaoxiao2021-12-14  18

    题目大意

    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.
    转载请注明原文地址: https://ju.6miu.com/read-968816.html

    最新回复(0)