Cod sursa(job #2193855)

Utilizator dragos231456Neghina Dragos dragos231456 Data 11 aprilie 2018 17:58:14
Problema Ferma Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.93 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("ferma.in");
ofstream g("ferma.out");
int mrk[20005],n,k,v[20005],s,i1,i2,best,ind,j=1,inf=(1<<30);
int bestmin,I1,I2,rez,nr;
bool ok=true;

void SSM()
{
    s=-inf; best=-inf; v[2*n]=-inf;
    for(int i=1;i<2*n;++i)
    {
        if(i==ind+n) break;
        while(mrk[i]==1 && i<2*n)
        {
            s=-inf; ++i;
        }
        if(s<0)
        {
            s=v[i];
            ind=i;
        }
        else s+=v[i];
        if(s>best)
        {
            i1=ind;
            i2=i;
            best=s;
        }
    }
}

void SSm()
{
    s=inf; bestmin=inf; v[2*n]=inf;
    for(int i=1;i<2*n;++i)
    {
        while(mrk[i]==0 && i<2*n)
        {
            s=inf; ++i;
        }
        if(s>0)
        {
            s=v[i];
            ind=i;
        }
        else s+=v[i];
        if(s<bestmin)
        {
            I1=ind;
            I2=i;
            bestmin=s;
        }
    }
}
int main()
{
    f>>n>>k;
    for(int i=1;i<=n;++i) f>>v[i];
    for(int i=1;i<=n;++i) v[i+n]=v[i];
    while(ok==true && nr<k)
    {
        ok=false;
        SSM();
        SSm();
        if(best>0 || bestmin<0) {ok=true;
        if(best>=-bestmin)
        {
            rez+=best;
            for(int i=i1;i<=i2;++i)
            {
                mrk[i]=1;
                if(i>n) mrk[i-n]=1;
                else mrk[i+n]=1;
            }
        }
        else
        {
            rez-=bestmin;
            for(int i=I1;i<=I2;++i)
            {
                mrk[i]=0;
                if(i>n) mrk[i-n]=0;
                else mrk[i+n]=0;
            }
        } }
        ++nr;
    }
    nr=0;
    for(int i=1;i<2*n;++i) nr+=mrk[i]; nr/=2;
    for(int i=nr+1;i<=k;++i)
    {
        SSM();
        rez+=best;
        mrk[i1]=1;
        mrk[i1+n]=1;
    }
    g<<max(rez,0);
    return 0;
}