HDU-Employment Planning题解

题目在这里
————————————————————————————————

Employment Planning

简单的一道dp 关键的点在于想到用枚举实现各种情况的讨论

关键的注释写在代码里了 还是很清晰的捏~

#include <bits/stdc++.h>
#define fo(x,y,z) for(int (x)=(y);(x)<=(z);(x)++)
#define fu(x,y,z) for(int (x)=(y);(x)>=(z);(x)--)
#define foo(x,y,z) for(int (x)=(y);(x)<(z);(x)++)
using namespace std;
inline int qr()
{
	char ch=getchar();int x=0,f=1;
	for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
	for(;ch>='0'&&ch<='9';ch=getchar())x=(x<<3)+(x<<1)+(ch^48);
	return x*f;
}
#define qr qr()
typedef long long ll;
const int Ratio=0;
const int N=10005;
const int maxx=INT_MAX;
int n,cb,gz,jg;
int maax,miin,sum;
int dh[15],zl[N][15];//i个人j月 
void read()
{
	cb=qr,gz=qr,jg=qr;
	fo(i,1,n)
		dh[i]=qr,maax=max(maax,dh[i]);//取一下人数最多的值 方便考虑 
}
void DrRatio()
{
	fo(i,dh[1],maax)//第一个月特殊先算 
		zl[i][1]=i*(cb+gz);
	fo(i,2,n)
		fo(j,dh[i],maax)//枚举可能的人数 
		{
			miin=maxx;
			fo(k,dh[i-1],maax)//比较上一个月 
			{
				sum=0;
				if(k>=j)//人少了 开除 
					sum=zl[k][i-1]+(k-j)*jg+j*gz;
				else//人多了 招聘 
					sum=zl[k][i-1]+(j-k)*cb+j*gz;
				miin=min(miin,sum);
			}
//因为把所有情况都枚举了 所以不用担心有不干活也不开除却更便宜的情况没被考虑 
			zl[j][i]=miin;
		}
	miin=maxx;
	fo(i,dh[n],maax)//最后找最后一个月所有情况中便宜的那种 就是最优 
		miin=min(miin,zl[i][n]);
}
void op()
{
	printf("%d\n",miin);
}
int main()
{
	while(scanf("%d",&n)&&n)
	{ 
		maax=0;
		read();
		DrRatio();
		op();
	}
	return Ratio;
}

posted @ 2024-02-16 14:46  DrRatio  阅读(16)  评论(0编辑  收藏  举报