1 #include<fstream>//竹子
2 using namespace std;
3 ifstream cin("eat.in");
4 ofstream cout("eat.out");
5 const int MAXT=100;
6 int a[MAXT+1],b[MAXT+1];
7 int main()
8 {
9 int t,n,s,k,i,f;//天数、竹子数、竹筒或竹园的开销、收益系数、循环变量、竹筒开始日
10 int z,zz,zt,m;//作竹筒前的竹子数、当前竹子数、当前竹筒数、最好收益
11 bool l=0;//f-1天是否建了竹园
12 cin>>t>>n>>s>>k;
13 for(i=1;i<t;i++)
14 cin>>a[i];
15 m=k*(i=min((n-t)/s,t))+max(n-i*s-t,0);//假设不建竹园
16 z=n;
17 for(f=1;f<=t;f++)
18 {//[1,f)建竹园,[f,t]作竹筒
19 if(l)
20 {//为f后面每天的竹子收入数增加f-1天那个竹园贡献的竹子
21 for(i=f;i<=t;i++)
22 b[i]+=a[i-f+1];
23 }
24
25 zz=z,zt=0;//作竹筒前的局部初始化
26 for(i=f;i<=t;i++)
27 {//每天贪心作竹筒
28 zz += b[i];
29 if(--zz>=s)
30 {//吃完1个竹子还够作竹筒
31 zt++;
32 zz-=s;
33 }
34 else if(zz<0)
35 break;
36 }
37 if(i>t)
38 m=max(m,k*zt+zz);
39
40 z+=b[f]-1;
41 l=z>=s;
42 if(l)
43 z-=s;
44 }
45 cout<<m<<endl;
46 return 0;
47 }