bzoj1569: [JSOI2008]Blue Mary的职员分配
http://www.lydsy.com/JudgeOnline/problem.php?id=1569
dp[i][j][a][b] 表示i个职员,发广告状态为j,已有金钱a,声誉b的最少天数
j=0 表示没有发广告,否则j表示距离发广告j天
枚举有t个人增加金钱,那就有i-t个人增加声誉
当j=3时,人数+1
当j=0或j=3时,考虑发不发广告
注意:
1、当天赚的钱可以用来发广告
2、新招募的人当天不能为公司带来收益
#include<cmath> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int ans; int dp[41][4][21][21]; int main() { freopen("data.in","r",stdin); // freopen("my.out","w",stdout); int n,x,y,z,A,B; scanf("%d%d%d%d%d%d",&n,&x,&y,&z,&A,&B); int ans=ceil(1.0*A/(n*x))+ceil(1.0*B/(n*y)); int ta=max(z,A); memset(dp,63,sizeof(dp)); dp[n][0][0][0]=0; int ni,na,nb; for(int i=n;i<=40;++i) for(int j=0;j<=3;++j) for(int a=0;a<=ta;++a) for(int b=0;b<=B;++b) if(dp[i][j][a][b]<ans) { if(a>=A && b>=B) { ans=min(ans,dp[i][j][a][b]); continue; } for(int t=0;t<=i;++t) { na=min(ta,a+t*x); nb=min(B,b+(i-t)*y); ni=i; if(j==3) ni++; if(j==0 || j==3) { dp[ni][0][na][nb]=min(dp[ni][0][na][nb],dp[i][j][a][b]+1); if(na>=z) dp[ni][1][na-z][nb]=min(dp[ni][1][na-z][nb],dp[i][j][a][b]+1); } else dp[ni][j+1][na][nb]=min(dp[ni][j+1][na][nb],dp[i][j][a][b]+1); } } printf("%d",ans); }
1569: [JSOI2008]Blue Mary的职员分配
Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 416 Solved: 178
[Submit][Status][Discuss]
Description
由于Blue Mary呕心沥血的管理,Blue Mary的网络公司蒸蒸日上。现在一共拥有了n名职员,可惜没有任何的金钱和声誉。平均每名每天职员都可以给公司带来x单位金钱或者y单位声誉(名利不能双全)。并且可以花费z单位的金钱在人才交易市场发布广告招聘职员,每次发布广告三天以后就会招聘到一名职员,并且必须在发布广告并且招聘到职员的那一天才能发布下一次广告。 Blue Mary计划以最快的时间获得至少A单位金钱和至少B单位声誉,请你计算一下他至少需要多少时间才能达到他的目标。
Input
输入有且仅有一行,包含六个整数n,x,y,z,A和B,意义如题目描述所述。
Output
要求输出一行,包含一个整数,表示Blue Mary至少需要多少时间才能达到他的目标。
Sample Input
1 2 3 4 5 6
Sample Output
5
HINT
1<=n,x,y,z,A,B<=20