• 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 MB
    Submit: 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

  • 相关阅读:
    亮剑.NET的系列文章之ADO.NET五大类(二)
    Effective C++ 读书笔记之Part6.Inheritance and ObjectOriented Design
    论计算机专业毕业生的人文素养
    LLVM每日谈之十四 如何给Clang添加一个属性
    那些年,面试中遇到的那些奇葩们
    亮剑.NET的系列文章之.NET实现三层架构(三)
    [转]C++预编译头文件
    [转]文件间的编译依赖性
    [转]详解编译预处理
    [转]Visual Studio 2005 IDE 技巧和窍门
  • 原文地址:https://www.cnblogs.com/TheRoadToTheGold/p/8202570.html
Copyright © 2020-2023  润新知