样例输出INF
#include<bits/stdc++.h>
#define INF (1ll<<62)
using namespace std;
struct node1
{
int need,buy,fwash,swash,fuse,suse;
}cnt[2008];
struct node2
{
int date,store;
};
deque<node2>que;
int totday,buy,fd,fc,sc,sd,ans;
long long getval(int totbuy)
{
long long totp=totbuy;
totp*=buy;
cnt[0].buy=cnt[0].need;
totbuy-=cnt[0].need;
for(int i=1;i<totday;i++)
{
if(i>=fd)
{
node2 temp;
temp.date=i-fd;
temp.store=cnt[i-fd].need;
que.push_back(temp);
}
cnt[i].fwash=cnt[i].swash=cnt[i].fuse=cnt[i].suse=0;
int re;
if(totbuy>=cnt[i].need)
{
totbuy-=cnt[i].need;
cnt[i].buy=cnt[i].need;
re=0;
continue;
}
re=cnt[i].need-totbuy;
cnt[i].buy=totbuy;
totbuy=0;
while(re&&!que.empty()&&que.front().date<=i-sd)
{
int use=re;
use=min(use,que.front().store);
cnt[que.front().date].swash+=use;
cnt[i].suse+=use;
totp+=use*sc;
re-=use;
que.front().store-=use;
if(!que.front().store)que.pop_front();
}
while(re&&!que.empty())
{
int use=re;
use=min(use,que.back().store);
cnt[que.back().date].fwash+=use;
cnt[i].fuse+=use;
totp+=use*fc;
re-=use;
que.back().store-=use;
if(!que.back().store)que.pop_back();
}
if(re)return INF;
}
return totp;
}
int base,sum;
int main()
{
cin>>totday;
for(int i=0;i<totday;i++)
{
cin>>cnt[i].need;
base=max(base,cnt[i].need);
sum+=cnt[i].need;
}
cin>>buy>>fd>>fc>>sd>>sc;
int l=base,r=sum;
long long left=getval(l),right=getval(r);
while(r-l>=3)
{
int len=(r-l)/3;
int a=l+len,b=r-len;
long long x=getval(a),y=getval(b);
if(left<=x&&x<=y||left>=x&&y>=x)
{
r=b;
right=y;
}
else
{
l=a;
left=x;
}
}
long long minn=left;
for(int i=l+1;i<=r;i++)
{
long long tmp=getval(i);
minn=min(minn,tmp);
}
cout<<minn;
return 0;
}