BZOJ 1569

来源:互联网 发布:bodog信誉第一js 编辑:程序博客网 时间:2024/04/29 18:56

这个题就是一个DP

F[I,J,K,P]表示在有I个员工 金钱是J  荣誉是K 距离发广告已经有P天的最小天数是多少

这个状态可以由 F[I-1{p=3) or i(p<3),*,*,MIN(P-1,0)] 推过来 里面俩个**指的是员工的分配方案,这个分配方案可以暴力枚举

在P=3的时候可员工人数多一个,并且可以转移到P=0 或者P=1

时间复杂度是O(最大员工数^2*x*y*4)

比较显然的是,我们不会招很多人,即使最坏情况,也最多只能找13个人,而在最坏情况下,并不可能招那么多,所以最大员工数在20+较为合理

所以时间完全足够

code


var  f:array[0..35,0..25,0..25,0..5] of longint;  x,y,z,a,b,aa,i,j,k,p,ans,xx,yy,ii,n,q:longint;function min(a,b:longint):longint;  begin    if a<b then exit(a) else exit(b);  end;procedure work(a1,b1,c1,d1:longint);  begin    if b1<0 then exit;if (b1>a) then b1:=a;if c1>b then c1:=b;f[a1,b1,c1,d1]:=min(f[a1,b1,c1,d1],f[i,j,k,p]+1);  end;begin  read(n,x,y,z,a,b);aa:=a;  a:=a+z-min(a,z);  for i:=0 to 30 do    for j:=0 to a do  for k:=0 to b do    for p:=0 to 3 do  f[i,j,k,p]:=maxlongint;  f[n,0,0,0]:=0;ans:=1000;  for i:=n to 34 do    for p:=0 to 3 do      for j:=0 to a do    for k:=0 to b do  begin    if f[i,j,k,p]=maxlongint then continue;if (j>=aa) and (k>=b) then   begin    ans:=min(ans,f[i,j,k,p]);continue;      end;if f[i,j,k,p]>ans then continue;for q:=0 to i do  begin    xx:=j+q*x;yy:=k+(i-q)*y;ii:=i;if p=3 then ii:=ii+1;if (p=0) or (p=3) then  begin    work(ii,xx,yy,0);work(ii,xx-z,yy,1);      endelse  work(ii,xx,yy,p+1);  end;  end;  writeln(ans);end.


仰慕200B就AC的!!跪烂!!至今不会200B做法!