记录编号 |
254738 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[HNOI 1999] 快餐问题 |
最终得分 |
100 |
用户昵称 |
水墨青花 |
是否通过 |
通过 |
代码语言 |
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;
}