#include <bits/stdc++.h>
#define N 50000
int read()
{
int k=1,x=0;
char ch;
ch=getchar();
while(ch<'0' || ch>'9')
{
if(ch=='-')
k=-1;
ch=getchar();
}
while(ch>='0' && ch<='9')
{
x=x*10+ch-'0';
ch=getchar();
}
return x*k;
}
struct NOTE
{
int w,n;
}p[N];
int f[N],Q[N],w[N];
int n,m;
int main()
{
n=read();
for(int i=1;i<=n;i++)
p[i].w=read();
for(int i=1;i<=n;i++)
p[i].n=read();
m=read();
memset(f,127,sizeof(f));
f[0]=0;
for(int i=1;i<=n;i++)
{
for(int j=0;j<p[i].w;j++)
{
int head=0,tail=0;
for(int k=j;k<=m;k+=p[i].w)
{
while(head<=tail && w[head]<k-p[i].w*p[i].n)
head++;
while(head<=tail && f[k]-(k-w[head])/p[i].w<=Q[tail])
tail--;
Q[++tail]=f[k];
w[tail]=k;
f[k]=std::min(f[k],Q[head]+(k-w[head])/p[i].w);
}
}
}
printf("%d\n",f[m]);
}
未完成 BZOJ 1531
最新推荐文章于 2019-11-17 23:02:42 发布