Cod sursa(job #1769764)

Utilizator Ruxandra985Nanu Ruxandra Laura Ruxandra985 Data 3 octombrie 2016 09:33:37
Problema Oo Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.5 kb
#include <cstdio>
#include <iostream>

using namespace std;
int v[100001],d[100001][2];
int main()
{
    FILE *fin=fopen ("oo.in","r");
    FILE *fout=fopen ("oo.out","w");
    int n,i,maxi,incmaxi,max0,max2;
    fscanf (fin,"%d",&n);
    for (i=1;i<=n;i++)
        fscanf (fin,"%d",&v[i]);
    // d[i][j]=suma maxima pe care o poate lua fermierul pana la poz i (inclusiv) cand ultima poz de pe care a luat e j
    d[1][0]=v[n]+v[1];
    d[1][1]=1;
    d[2][0]=v[1]+v[2];
    d[2][1]=0;
    d[3][0]=v[2]+v[3];
    d[3][1]=2;
    maxi=d[1][0];
    max0=max(d[2][0],d[3][0]);
    incmaxi=d[1][1];
    for (i=4;i<n-1;i++){
        if (i==6)
            printf ("a");
        if (d[i-3][0]+v[i]+v[i-1]>maxi+v[i]+v[i-1]){
            d[i][0]=d[i-3][0]+v[i]+v[i-1];
            d[i][1]=d[i-3][1];
        }
        else {
            d[i][0]=maxi+v[i]+v[i-1];
            d[i][1]=incmaxi;
        }
        if (maxi<d[i-3][0]){
            maxi=d[i-3][0];
            //printf ("%d %d\n",maxi,i);
            incmaxi=d[i-3][1];
        }
        if (d[i][1]==0){
            max0=max(max0,d[i][0]);
            //printf ("%d %d\n",max0,i);
        }
        else if (d[i][1]==2)
            max2=max(max2,d[i][0]);
    }
    maxi=max(maxi,d[n-2][0]);
    maxi=max(maxi,d[n-3][0]);
    if (d[n-3][0]!=maxi && d[n-2][0]!=maxi)
        maxi=max(maxi,max(max0,max2)+v[n-1]+v[n]);
    if (d[n-2][0]!=maxi)
        maxi=max(maxi,max2+v[n-1]+v[n]);
    fprintf (fout,"%d",maxi);
    return 0;
}