Cod sursa(job #2422342)

Utilizator ioana.jianuIoana Jianu ioana.jianu Data 18 mai 2019 13:48:14
Problema Oo Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.52 kb
#include <iostream>
#include <stdio.h>

using namespace std;

const int NMAX = 100001;
int s[NMAX], v[NMAX];

void functie (int inc, int sf, int &sum) {
    int maxim, poz, sump;
    if (sf - inc >= 6) {
        maxim = s[inc];
        poz = inc;
        if (s[inc + 1] > maxim) {
            maxim = s[inc + 1];
            poz = inc + 1;
        }
        if (s[inc + 2] > maxim) {
            maxim = s[inc + 2];
            poz = inc + 2;
        }
        if (poz == inc) {
            sum += s[inc];
            functie (inc + 3, sf, sum);
        }
        else if (poz == inc + 1) {
            if (s[inc] + s[inc + 3] >= s[inc + 1] + s[inc + 4]) {//alegem1
                sum += s[inc];
                functie (inc + 3, sf, sum);
            }
            else {
                sum += s[inc + 1];
                functie (inc + 4, sf, sum);
            }
        }
        else {
            sump = s[inc + 2] + s[inc + 5];
            if (sump > s[inc + 1] + s[inc + 4] && sump > s[inc] + s[inc + 4] && sump > s[inc] + s[inc + 3]) {
                sum += s[inc + 2];
                functie (inc + 5, sf, sum);
            }
            else if (s[inc] + s[inc + 3] >= s[inc + 1] + s[inc + 4] || s[inc] + s[inc + 4] >= s[inc + 1] + s[inc + 4]) {
                sum += s[inc];
                functie (inc + 3, sf, sum);
            }
            else {
                sum += s[inc + 1];
                functie (inc + 4, sf, sum);
            }
        }
    }
    else {
        if (sf - inc == 1)
            sum += s[inc];
        if (sf - inc == 2)
            sum += max (s[inc], s[inc + 1]);
        if (sf - inc == 3)
            sum += max (s[inc], max(s[inc + 1], s[inc + 2]));
        if (sf - inc == 4)
            sum += max (s[inc] + s[inc + 3], max(s[inc + 1], s[inc + 2]));
        if (sf - inc == 5)
            sum += max (max(s[inc] + s[inc + 3], s[inc] + s[inc + 4]), max (s[inc + 1] + s[inc + 4], s[inc + 2]));
    }

}

int main() {

    freopen ("oo.in", "r", stdin);
    freopen ("oo.out", "w", stdout);

    int n, i, s1, s2, s3, s4;

    scanf ("%d", &n);
    for (i = 1; i <= n; i++) {
        scanf ("%d", &v[i]);
        s[i - 1] = v[i - 1] + v[i];
    }

    ///primul si ultimul
    s1 = v[1] + v[n];
    functie (3, n - 2, s1);

    s2 = v[1] + v[2];
    functie (4, n - 1, s2);

    s3 = v[2] + v[3];
    functie (5, n, s3);

    s4 = v[3] + v[4];
    functie (6, n, s4);

    printf ("%d", max (max(s1, s2), max(s3, s4)));

    return 0;
}