BZOJ 1569

这个题就是一个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);
			      end
				else
				  work(ii,xx,yy,p+1);
			  end;
		  end;
  writeln(ans);
end.


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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值