POJ 1275 Cashier Employment 出纳员问题 差分约束系统

    xiaoxiao2021-12-14  21

    题目:

    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)更多 的出纳员在工作。

    分析

    附上代码:

    const   maxn=1000; type   node=record   fromv,endv,v:longint; end; var   n,m,n1,temp:longint;   elist:array [1..maxn] of node;   t,value,data:array [-1..maxn] of longint; procedure add(x,y,z:longint); begin   inc(m);   with elist[m] do     begin       fromv:=x; endv:=y; v:=z;     end; end; procedure init; var   i,x:longint; begin   for i:=0 to 23 do     read(value[i]);   readln;   readln(n);   fillchar(t,sizeof(t),0);   for i:=1 to n do     begin       readln(x);       inc(t[x]);     end; end; procedure main; var   i,j,min:longint;   check:boolean; begin   for min:=1 to n do     begin       m:=0;       for i:=-1 to 23 do         data[i]:=maxn*maxn;       add(23,-1,-min);       for i:=0 to 23 do         begin           add(i,i-1,0); add(i-1,i,t[i]);           if i>7 then             add(i,i-8,-value[i])           else             add(i,i+16,-value[i]+min);         end;       for j:=0 to 23 do         begin           check:=true;           for i:=1 to m do              with elist[i] do                if data[endv]>data[fromv]+v then                  begin                    data[endv]:=data[fromv]+v;                    check:=false;                  end;           if check then             break;         end;       check:=true;       for i:=1 to m do         with elist[i] do           if data[endv]>data[fromv]+v then             begin               check:=false;               break;             end;       if check then         begin           writeln(min);           exit;         end;     end;   writeln('No Solution'); end; begin   readln(n1);   for temp:=1 to n1 do     begin       init;       main;     end; end.

    转载请注明原文地址: https://ju.6miu.com/read-968837.html

    最新回复(0)