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 }