Cod sursa(job #3242912)

Utilizator PatrikKev75Szucs Patrik - Kevin PatrikKev75 Data 14 septembrie 2024 16:36:28
Problema Subsecventa de suma maxima Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 5.46 kb
// https : // infoarena.ro/problema/ssm
#include <fstream>
#include <algorithm>

using namespace std;

ifstream in("ssm.in");
ofstream out("ssm.out");

//-----------------------------------------------

int n, s = 0, maxim = -2147483648, start = 1, End = 1;

//------------------------------------------------------------------------------------------

void read(int t[])
{
    for (int i = 0; i < n; i++)
    {
        in >> t[i];
    }
}

//------------------------------------------------------------------------------------------

void first(int t[], int n)
{
    for (int i = 0; i < n; i++)
    {
        // in >> t[i];
        for (int j = i; j < n; j++)
        {
            for (int k = i; k <= j; k++)
            {
                s += t[k];
                if (s > maxim)
                {
                    maxim = s;
                    start = i + 1;
                    End = k + 1;
                }
            }

            s = 0;
        }
    }
}

//------------------------------------------------------------------------------------------

void second(int t[])
{

    for (int i = 0; i < n; i++)
    {
        for (int j = i; j < n; j++)
        {
            s += t[j];
            if (s > maxim)
            {
                maxim = s;
                start = i + 1;
                End = j + 1;
            }
        }
        s = 0;
    }
}

//------------------------------------------------------------------------------------------

// FIXME:valszeg nem megy i = 0 es j = 0 ra egyszere

void second2(int t[])
{
    int *subtotal = new int[n];

    in >> t[0];
    subtotal[0] = t[0];
    for (int i = 1; i < n; i++)
    {
        in >> t[i];
        subtotal[i] = subtotal[i - 1] + t[i];
    }

    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < i; j++)
        {
            s = subtotal[i] - subtotal[j];
            if (s > maxim)
            {
                maxim = s;
                start = j + 2;
                End = i + 1;
            }
        }
        s = 0;
    }

    delete[] subtotal;
}

//------------------------------------------------------------------------------------------

// FIXME: mar nem tudom mi a baja

void third(int t[])
{

    /*int *subtotal = new int[n], minSub = 0, iminSub = 0;

    in >> t[0];
    subtotal[0] = t[0];
    for (int i = 1; i < n; i++)
    {
        in >> t[i];
        subtotal[i] = subtotal[i - 1] + t[i];
    }

    for (int i = 0; i < n; i++)
    {

        int diff = subtotal[i] - minSub;
        if (diff > maxim)
        {
            maxim = diff;
            start = iminSub + 1;
            End = i + 1;
        }

        if (subtotal[i] < minSub)
        {
            minSub = subtotal[i];
            iminSub = i + 1;
        }
    }

    delete[] subtotal;*/

    int subtotal = 0, minSub = 0, iminSub = 0;

    int elem;
    for (int i = 0; i < n; i++)
    {
        in >> elem;
        subtotal = subtotal + elem;

        int diff = subtotal - minSub;
        if (diff > maxim)
        {
            maxim = diff;
            start = iminSub + 1;
            End = i + 1;
        }

        if (subtotal < minSub)
        {
            minSub = subtotal;
            iminSub = i + 1;
        }
    }
}

//------------------------------------------------------------------------------------------

// DONE: nem tudom mi a baj csak 95p

void third2(int t[])
{
    /*
    int *best = new int[n];

    best[0] = t[0];
    int current = 1;

    for (int i = 1; i < n; i++)
    {
        best[i] = max(t[i], best[i - 1] + t[i]);

        if (best[i] == t[i])
        {

            current = i + 1; // azert kell mert egy uj reszosszeg kezdodik, viszont a startot itt nem lehet frissiteni mert nem biztos hogy ez a legnayobb
        }

        /*if (best[i - 1] + t[i] > t[i])
        {
            best[i] = best[i - 1] + t[i];
        }

        else
        {
            best[i] = t[i];
            current = i + 1; // azert kell mert egy uj reszosszeg kezdodik, viszont a startot itt nem lehet frissiteni mert nem biztos hogy ez a legnayobb
        }*a/

        if (maxim < best[i])
        {
            maxim = best[i];
            start = current;
            End = i + 1;
        }
    }

    delete[] best;
    */

    int best = t[0], current = 1;
    maxim = t[0];

    for (int i = 1; i < n; i++)
    {
        // best = max(t[i], best + t[i]);

        /*if (best == t[i])
        {

            current = i + 1; // azert kell mert egy uj reszosszeg kezdodik, viszont a startot itt nem lehet frissiteni mert nem biztos hogy ez a legnayobb
        }*/

        if (best + t[i] >= t[i])
        {
            best = best + t[i];
        }

        else
        {
            best = t[i];
            current = i + 1; // azert kell mert egy uj reszosszeg kezdodik, viszont a startot itt nem lehet frissiteni mert nem biztos hogy ez a legnayobb
        }

        if (maxim < best)
        {
            maxim = best;
            start = current;
            End = i + 1;
        }
    }
}
//------------------------------------------------------------------------------------------

int main()
{
    in >> n;

    int *t; //= new int[n];

    /*for (int i = 0; i < n; i++)
    {
        in >> t[i];
    }*/

    third(t);

    out << maxim << " " << start << " " << End;

    delete[] t;

    return 0;
}