Trova la somma pari massima v. 2

Portale di allenamento delle Olimpiadi Italiane di Informatica

Topolino ha ricevuto in regalo un’altra sequenza di N numeri interi Si.
Vuole cercare, per ogni possibile coppia di numeri (in posizioni distinte) scelti dalla sequenza, la somma massima che sia anche pari.
Aiuta Topolino scrivendo un programma che, presi in ingresso N e la sequenza di interi Si, stampi in uscita la somma massima di una coppia tra le somme pari.
Se N fosse uguale a 10 e la sequenza ricevuta da Topolino fosse la seguente:

 1  2  3  4  5  6  7  8  9 10

allora il tuo programma dovrebbe stampare 18 (ottenibile come 10+8).

Dati di input

Nel file input.txt sono presenti due righe di testo: nella prima c’è un singolo numero intero positivo N, nella seconda ci sono gli N interi Si, separati da spazio, che compongono la sequenza di Topolino.

Dati di output

Nel file output.txt dovrai stampare un singolo numero intero, la somma massima tra le somme pari delle coppie ricevute in input.
Se tale somma non dovesse esistere, allora dovrai stampare -1.

Assunzioni

  • 1 ≤ N ≤ 100000
  • 0 ≤ Si < 1000000.

Esempi di input/output

input.txt output.txt
10
1 2 3 4 5 6 7 8 9 10
18
2
13 13
26

/*
    www.valcon.it
    Portale di allenamento delle Olimpiadi Italiane di Informatica
    Trova la somma pari massima v. 2
*/

#include 
#include 
using namespace std;

int main()
{
    ifstream fin ( "input.txt");
    ofstream fout("output.txt");
	
    long N,
         S,
         pari1, pari2,
         disp1, disp2;
	    
    pari1=pari2=disp1=disp2=-1;

    fin >> N;	
    for(long i=1; i <= N; i++)
    {
        fin >> S;
        if(S%2 == 0)
        {
                 if(S > pari1) { pari2=pari1; pari1=S; }
            else if(S > pari2) { pari2=S;              }
        }
        else
        {
                 if(S > disp1) { disp2=disp1; disp1=S; }
            else if(S > disp2) { disp2=S;              }
        }
    }
    if(pari1 == -1 || pari2 == -1) pari1  = -1;
    else                           pari1 += pari2;
    if(disp1 == -1 || disp2 == -1) disp1  = -1;
    else                           disp1 += disp2;

    fout << max(pari1, disp1);
    return 0;
}

Lascia un commento