首页 > 其他分享 >DFS略思维题做题记录

DFS略思维题做题记录

时间:2022-10-20 10:35:54浏览次数:84  
标签:思维 Dayz int money DFS Emcd 做题 reput staff

洛谷:P4399 [JSOI2008]Blue Mary的职员分配

链接

代码:

#include<iostream>
using namespace std;
int n,x,y,z,A,B,Ans=INT_MAX;
void Depth_fs(int staff/*员工*/,int money/*现有钱数*/,int reput/*现有声誉*/,int Dayz/*经过天数*/,int Emcd/*招聘冷却*/)
{
    if(Dayz>Ans) return;//如果已经比现存最优解要差就终止搜索 
    
    int disted=1;//已经分配的人数 (因为最后会加到n+1所以初值赋为一) 
    while(disted<=staff&&money<A) {//因为赚钱可以用于招聘员工所以贡献更大故而优先赚钱 (贪心思想)
        disted++; money+=x;
    }
    
    while(disted<=staff&&reput<B) {//剩余员工用于赚取声誉 
        disted++; reput+=y;
    }
    
    if(money>=A&&reput>=B) {//钱和声誉都赚够了(因为如果比之前最优解的情况已经被剪掉所以这就是新的最优解) 
        Ans=Dayz; return;
    }
    
    if(Emcd>=0) {//经过一天招聘冷却-1 
        Emcd--;
        if(Emcd==0) {
            staff++;
        }
    }
    
    Depth_fs(staff,money,reput,Dayz+1,Emcd);//不招聘新员工 
    
    if(money>=z&&Emcd<=0) {
        Depth_fs(staff,money-z,reput,Dayz+1,3);//招聘新员工 
    } 
    
    return;
}

int main()
{
    cin>>n>>x>>y>>z>>A>>B;
    Depth_fs(n,0,0,1,-1); 
    cout<<Ans;
    return 0; 
} 

 

标签:思维,Dayz,int,money,DFS,Emcd,做题,reput,staff
From: https://www.cnblogs.com/XdzxBo/p/16808824.html

相关文章