记录编号 |
312283 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[HNOI 1999] 快餐问题 |
最终得分 |
100 |
用户昵称 |
Go灬Fire |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
2.631 s |
提交时间 |
2016-09-25 21:43:23 |
内存使用 |
28.50 MiB |
显示代码纯文本
#include<cmath>
#include<cstring>
#include<algorithm>
#include<cstdio>
using namespace std;
const int maxn=210;
int f[maxn][maxn][maxn],a[maxn];int A,B,C,n,ans;
//f[i][j][k]代表前i条生产线生产j个汉堡,k个薯条还可以生产饮料的数量
int shu,han,yin,maxa,maxb,maxc;
bool Cheak(int,int,int);
void Init();
int main(){
freopen("meal.in","r",stdin);
freopen("meal.out","w",stdout);
Init();
return 0;
}
void Init(){
memset(f,-1,sizeof(f));
f[0][0][0]=0;
scanf("%d%d%d",&A,&B,&C);//套餐
scanf("%d%d%d",&han,&shu,&yin);//单位时间
scanf("%d",&n);
int Time=A*han+B*shu+C*yin,m=0,tt=0;
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
int k=a[i]/Time;
m+=k;
tt+=a[i];
}
int _min=100/max(A,max(B,C));//每件最多100个,套餐数是最大的
if(m>_min){
printf("%d",_min);return;
}
maxa=min(tt/han,100),maxb=min(tt/shu,100),maxc=min(tt/yin,100);//可以生产的汉堡 薯条 饮料的数量
for(int i=1;i<=n;i++){
for(int j=0;j<=maxa;j++){
for(int k=0;k<=maxb;k++){
if(Cheak(i-1,j,k)==1){//如果生产f[i-1][j][k]个饮料还可以生产1个汉堡或1个薯条
for(int jj=j;jj>=0;jj--){
for(int kk=k;kk>=0;kk--){
int temp=(j-jj)*han+(k-kk)*shu;
if(temp>=a[i])break;
int haha=(a[i]-temp)/yin;
if(f[i-1][jj][kk]!=-1){
f[i][j][k]=max(f[i][j][k],f[i-1][jj][kk]+haha);
}
}
}
}
else f[i][j][k]=f[i-1][j][k];
}
}
}
for(int i=1;i<=maxa;i++){
for(int j=1;j<=maxb;j++){
int haha=min(i/A,min(j/B,f[n][i][j]/C));
ans=max(haha,ans);
}
}
printf("%d",ans);
}
bool Cheak(int i,int j,int k){
int temp=f[i][j][k];
if(temp>maxc){
if((j<maxa && (temp-maxc)*yin>=han) || (k<maxb && (temp-maxc)*yin>=shu)){
return 0;
}
}
else return 1;
}