Cod sursa(job #2032317)

Utilizator stefzahZaharia Stefan Tudor stefzah Data 4 octombrie 2017 20:17:55
Problema Ferma Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
#include <fstream>
using namespace std;
ifstream fin("ferma.in");
ofstream fout("ferma.out");
int n,k,i,x[20005],j,a[20005],b1[20005],b[20005],pa[20005],pb[20005],pb1[20005],mx;
int main()
{fin>>n>>k;
 for(i=1;i<=n;i++)
    {fin>>x[i];
    }
 for(i=1;i<=n;i++)
    x[i+n]=x[i];
 for(i=1;i<=k;i++)
    {for(j=1;j<=2*n;j++)
        {a[j]=max(b1[j-1],max(0,max(b1[j-1]+x[j],a[j-1]+x[j])));
         if(a[j]==0)pa[j]=j+1;
         else if(a[j]==x[j])pa[j]=j;
         else {if(a[j]==b1[j-1]+x[j]&&a[j]>a[j-1]+x[j])pa[j]=pb1[j-1];
               else if(a[j]==a[j-1]+x[j]&&a[j]>b1[j-1]+x[j])pa[j]=pa[j-1];
               else pa[j]=max(pb1[j-1],pa[j-1]);
              }
         b[j]=max(b[j-1],max(a[j-1],b1[j]));
         if(j-pa[j]>=n){pa[j]++;a[j]-=x[j];}
         if(b[j]==b[j-1])pb[j]=pb[j-1];
         else if(b[j]==a[j-1]&&b[j]>b1[j])pb[j]=pa[j-1];
         else if(b[j]==b1[j]&&b[j]>a[j-1])pb[j]=pb1[j];
         else pb[j]=max(pa[j-1],pb[j-1]);
         if(j-pb[j]>=n){pb[j]++;b[j]-=x[j];}
         //fout<<a[j]<<"("<<b[j]<<")"<<" ";
         if(mx<a[j])mx=a[j];
        }
        //fout<<"\n";
     for(j=1;j<=2*n;j++)
        {b1[j]=b[j];
        pb1[j]=pb[j];
        pa[j]=0;
        pb[j]=0;
        a[j]=0;
        b[j]=0;
        }
    }
 fout<<mx;
}