Cod sursa(job #470026)

Utilizator miculprogramatorA Cosmina - vechi miculprogramator Data 10 iulie 2010 20:12:47
Problema Oo Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.52 kb
#include <stdio.h>
using namespace std;

int v[100001];
int n, i, j;
int S, pozitie;
int Max, gasit;

struct oua
{
    int suma;
    int poz;
}ou[100001];

int main ()
{
    FILE *f = fopen ("oo.in","r");
    FILE *g = fopen ("oo.out","w");
    fscanf (f,"%d", &n);
    for (i=1; i<=n; ++i)
        fscanf (f,"%d", &v[i]);

    if (v[1] + v[2] > v[1] + v[n])
    {
        ou[1].suma = v[1] + v[2];
        ou[1].poz = 2;
    }
    else
    {
        ou[1].suma = v[1] + v[n];
        ou[1].poz = n;
    }

    if (v[n] + v[1] > v[n] + v[n-1])
    {
        ou[n].suma = v[n] + v[1];
        ou[n].poz = 1;
    }
    else
    {
        ou[n].suma = v[n] + v[n-1];
        ou[n].poz = n - 1;
    }

    for (i=2; i<n; ++i)
    {
        if (v[i] + v[i+1] > v[i] + v[i-1])
        {
            ou[i].suma = v[i] + v[i+1];
            ou[i].poz = i + 1;
        }
        else
        {
            ou[i].suma = v[i] + v[i-1];
            ou[i].poz = i - 1;
        }
    }

    /*for (i=1; i<=n; ++i)
        printf ("%d ", ou[i].suma);
    printf ("\n\n");
    for (i=1; i<=n; ++i)
        printf ("%d ", ou[i].poz);*/

    while (1)
    {
        gasit = 0;
        Max = 0;
        for (i=1; i<=n; ++i)
            if (ou[i].suma > Max && ou[ou[i].poz].poz != -1 && ou[i].poz != -1)
            {
                Max = ou[i].suma;
                pozitie = i;
                gasit = 1;
            }

        if (gasit)
        {
            S += Max;
            if (pozitie == 1)
            {
                if (ou[1].poz == n)
                    ou[n].poz = ou[n-1].poz = ou[1].poz = ou[2].poz = -1;
                else
                    ou[1].poz = ou[n].poz = ou[2].poz = ou[3].poz = -1;
            }
            else if (pozitie == n)
            {
                if (ou[n].poz == 1)
                    ou[n].poz = ou[1].poz = ou[2].poz = ou[n-1].poz = -1;
                else
                    ou[n].poz = ou[n-1].poz = ou[n-2].poz = ou[1].poz = -1;
            }
            else
            {
                ou[ou[pozitie].poz].poz = ou[ou[pozitie].poz+1].poz = ou[ou[pozitie].poz-1].poz = -1;
                ou[pozitie].poz = ou[pozitie-1].poz = ou[pozitie+1].poz = -1;
            }
        }
        else
            break;

        /*for (i=1; i<=n; ++i)
            printf ("%d ", ou[i].poz);
        printf ("\n_________\n");*/
    }
    //printf ("%d", S);

    fprintf (g,"%d", S);

    fclose(g);
    fclose(f);
    return 0;
}