记录编号 254738 评测结果 AAAAAAAAAA
题目名称 [HNOI 1999] 快餐问题 最终得分 100
用户昵称 Gravatar水墨青花 是否通过 通过
代码语言 C++ 运行时间 0.210 s
提交时间 2016-04-25 17:15:26 内存使用 0.35 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>

using namespace std;

void Read();
int Getmin(int,int,int);
void Presolve(int,int,int,int,int,int);

int a,b,c;
int p1,p2,p3;
int n;
int t[11];
int f[11][101][101];//前i条生产线生产饮料数 
int d[11][101][101];//drink 第i条生产线生产饮料数 
int tot=0;
int preans=0;
int maxa,maxb,maxc;
int group=0;
bool isend=false;

int all()
{
	freopen("meal.in","r",stdin);
	freopen("meal.out","w",stdout);
	
	memset(f,-1,sizeof(f));
	f[0][0][0]=0;
	memset(d,0,sizeof(d));
	
	Read();
	if(isend)
	{
		fclose(stdin);
		fclose(stdout);
		return 0;
	}
	
	maxa=(tot/(a*p1+b*p2+c*p3))*a;
	maxb=(tot/(a*p1+b*p2+c*p3))*b;
	maxc=(tot/(a*p1+b*p2+c*p3))*c;
	
	for(int i=1;i<=n;i++)//生产线 
	{
		for(int j=0;j<=maxa;j++)//humburger
		{
			for(int k=0;k<=maxb;k++)//chips
			{
				if(f[i-1][j][k]<=maxc)
				{
					for(int je=0;je<=j;je++)
					{
						for(int ke=0;ke<=k;ke++)
						{
							if(f[i-1][j-je][k-ke]!=-1)
							{
								d[i][je][ke]=(t[i]-(j-je)*p1-(k-ke)*p2)/p3;
								f[i][j][k]=max(f[i][j][k],f[i-1][j-je][k-ke]+d[i][je][ke]);
							}
						}
					}
				}
				else
				{
					f[i][j][k]=f[i-1][j][k];
				}
				
			}
		}
	}
	
	int ans=0;
	for(int j=1;j<=maxa;j++)
	{
		for(int k=1;k<=maxb;k++)
		{
			ans=max(ans,Getmin(j/a,k/b,f[n][j][k]/c));
		}
	}
	
	printf("%d\n",ans+preans);
	
	
	fclose(stdin);
	fclose(stdout);
	return 0;
}

int allabove=all();

int main()
{
	;
}

void Read()
{
	scanf("%d%d%d",&a,&b,&c);
	scanf("%d%d%d",&p1,&p2,&p3);
	scanf("%d",&n);
	int m=0;
	group=a*p1+b*p2+c*p3;	//一套套餐所用时间
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&t[i]);
		tot+=t[i];
		m+=t[i]/group;
	}

	if(m!=0&&m>=Getmin(100/a,100/b,100/c))
	{
		printf("%d",Getmin(100/a,100/b,100/c));
		isend=true;
		return;
	}
	if(m==0)
	{
		if((tot/group)>=Getmin(100/a,100/b,100/c))
		{
			printf("%d",Getmin(100/a,100/b,100/c));
			isend=true;
			return;
		}
	}
	
	Presolve(a,b,c,p1,p2,p3);
}

void Presolve(int pa,int pb,int pc,int pp1,int pp2,int pp3)
{
	for(int i=1;i<=n;i++)
	{
		if(t[i]>=5*(pa*pp1+pb*pp2+pc*pp3))
		{
			for(int j=1;j<=3;j++)
			{
				t[i]-=pa*pp1+pb*pp2+pc*pp3;
				tot-=pa*pp1+pb*pp2+pc*pp3;
				preans++;
			}
		}
	}
}

int Getmin(int ga,int gb,int gc)
{
	int minn=0x7fffffff;
	if(ga<minn)
	{
		minn=ga;
	}
	if(gb<minn)
	{
		minn=gb;
	}
	if(gc<minn)
	{
		minn=gc;
	}
	return minn;
}