Cod sursa(job #2396440)

Utilizator Theo20067Cismaru Theodor-Alexe Theo20067 Data 3 aprilie 2019 15:09:47
Problema Restante Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.7 kb
#include <fstream>

using namespace std;

ifstream fin("split.in");
ofstream fout("split.out");

int n,i,j,k,v[5005],minst[5005],maxst[5005],mindr[5005],maxdr[5005];

int main()
{
    fin >> n;
    for (i=1; i<=n; i++)
        fin >> v[i];
    minst[1] = maxst[1] = v[1];
    for (i=2; i<=n; i++)
    {
        minst[i] = min(minst[i-1], v[i]);
        maxst[i] = max(maxst[i-1], v[i]);
    }
    mindr[n] = maxdr[n] = v[n];
    for (i=n-1; i>=1; i--)
    {
        mindr[i] = min(mindr[i+1], v[i]);
        maxdr[i] = max(maxdr[i+1], v[i]);
    }
    int costmax = 0; int isolsol = 0; int jsolsol = 0; int ksolsol = 0;
    for (j=4; j<=n-4; j++)
    {
        int minim1 = v[j]; int maxim1 = v[j]; int maxx1 = 0;
        int isol = 0; int ksol = 0;
        for (i=j-1; i>=3; i--)
        {
            minim1 = min(minim1, v[i]);
            maxim1 = max(maxim1, v[i]);
            if (maxim1-minim1+maxst[i-1]-minst[i-1] >= maxx1)
            {
                maxx1 = maxim1-minim1+maxst[i-1]-minst[i-1];
                isol = i;
            }
        }
        int minim2 = v[j+1]; int maxim2 = v[j+1]; int maxx2 = 0;
        for (k=j+2; k<=n-2; k++)
        {
            minim2 = min(minim2, v[k]);
            maxim2 = max(maxim2, v[k]);
            if (maxim2-minim2+maxdr[k+1]-mindr[k+1] > maxx2)
            {
                maxx2 = maxim2-minim2+maxdr[k+1]-mindr[k+1];
                ksol = k;
            }
        }
        if (maxx1+maxx2 > costmax)
        {
            costmax = maxx1+maxx2;
            isolsol = isol-1; jsolsol = j; ksolsol = ksol;
        }
    }
    fout << costmax << "\n" << isolsol << " " << jsolsol << " " << ksolsol;
    return 0;
}