# Problema "Somma pari massima v2.0"

**URL:** <https://forum.olinfo.it/t/problema-somma-pari-massima-v2-0/3792>\
**Category:** Aiuto\
**Created:** [25 Aprile 2014, 1:52pm UTC](https://forum.olinfo.it/t/problema-somma-pari-massima-v2-0/3792 "2014-04-25T13:52:32Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![Rob97](https://forum.olinfo.it/letter_avatar_proxy/v4/letter/r/b4bc9f/32.png) [@Rob97](https://forum.olinfo.it/u/Rob97)\
**Post date:** [25 Aprile 2014, 1:52pm UTC](https://forum.olinfo.it/t/problema-somma-pari-massima-v2-0/3792/1 "2014-04-25T13:52:32Z")

</div>

Ho provato con questo codice e il programma funziona con gli esempi riportati e con alcuni miei esempi… Ho ricevuto inizialmente 0/100… Quando ho modificato i parametri delle assunzioni (ho incluso N=1 e N= 100000) ho ricevuto 70/100 ma stranamente niente 100/100…

Il codice è questo:

#include \<iostream\>

#include \<fstream\>

using namespace std;

int main()

{

&nbsp; &nbsp; int vettore[100000]={0},somma\_pari=0,n=0,i=0,j,var=0;

&nbsp; &nbsp; fstream file;

&nbsp; &nbsp; file.open(“input.txt”,ios::in);

&nbsp; &nbsp; if(!file.is\_open())

&nbsp; &nbsp; {

&nbsp; &nbsp; &nbsp; &nbsp; file.open(“output.txt”,ios::out);

&nbsp; &nbsp; &nbsp; &nbsp; file\<\<-1;

&nbsp; &nbsp; &nbsp; &nbsp; file.close();

&nbsp; &nbsp; &nbsp; &nbsp; return -1;

&nbsp; &nbsp; }

&nbsp; &nbsp; file\>\>n;

&nbsp; &nbsp; if(n\<1 || n\>100000)

&nbsp; &nbsp; {

&nbsp; &nbsp; &nbsp; &nbsp; file.open(“output.txt”,ios::out);

&nbsp; &nbsp; &nbsp; &nbsp; file\<\<-1;

&nbsp; &nbsp; &nbsp; &nbsp; file.close();

&nbsp; &nbsp; &nbsp; &nbsp; return -1;

&nbsp; &nbsp; }

&nbsp; &nbsp; do

&nbsp; &nbsp; {

&nbsp; &nbsp; &nbsp; &nbsp; file\>\>vettore[i];

&nbsp; &nbsp; &nbsp; &nbsp; if(vettore[i]\<0 || vettore[i]\>1000000)

&nbsp; &nbsp; &nbsp; &nbsp; {

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; file.open(“output.txt”,ios::out);

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; file\<\<-1;

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; file.close();

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return -1;

&nbsp; &nbsp; &nbsp; &nbsp; }

&nbsp; &nbsp; &nbsp; &nbsp; i++;

&nbsp; &nbsp; }while(!file.eof());

&nbsp; &nbsp; file.close();

&nbsp; &nbsp; for(i=0; i\<n;i++)

&nbsp; &nbsp; {

&nbsp; &nbsp; &nbsp; &nbsp; for(j=0;j\<n;j++)

&nbsp; &nbsp; &nbsp; &nbsp; {

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if((vettore[i]+vettore[j])%2==0 && vettore[i]+vettore[j]\>somma\_pari && i!=j)

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; somma\_pari= vettore[i]+vettore[j];

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; var++;

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }

&nbsp; &nbsp; &nbsp; &nbsp; }

&nbsp; &nbsp; }

&nbsp; &nbsp; file.open(“output.txt”,ios::out);

&nbsp; &nbsp; if(var==0)

&nbsp; &nbsp; &nbsp; &nbsp; file\<\<-1;

&nbsp; &nbsp; else

&nbsp; &nbsp; &nbsp; &nbsp; file\<\<somma\_pari;

&nbsp; &nbsp; file.close();

}

---

<div class="post-metadata">

**Author:** ![wil93](https://forum.olinfo.it/user_avatar/forum.olinfo.it/wil93/32/2862_2.png) [@wil93](https://forum.olinfo.it/u/wil93)\
**Post date:** [25 Aprile 2014, 2:29pm UTC](https://forum.olinfo.it/t/problema-somma-pari-massima-v2-0/3792/2 "2014-04-25T14:29:23Z")

</div>

Se clicchi sull’ID numerico della tua sottoposizione ti viene elencato l’esito per ogni caso di test. A occhio e croce direi che leggerai qualcosa del tipo “Execution timed out” ovvero che hai superato il tempo di esecuzione messo a disposizione per il tuo programma.

---

<div class="post-metadata">

**Author:** ![Rob97](https://forum.olinfo.it/letter_avatar_proxy/v4/letter/r/b4bc9f/32.png) [@Rob97](https://forum.olinfo.it/u/Rob97)\
**Post date:** [25 Aprile 2014, 2:32pm UTC](https://forum.olinfo.it/t/problema-somma-pari-massima-v2-0/3792/3 "2014-04-25T14:32:39Z")

</div>

Aaaah, si hai ragione! non me ero accorto di questa finestra… Grazie mille!

---

<div class="post-metadata">

**Author:** ![VashTheStampede](https://forum.olinfo.it/user_avatar/forum.olinfo.it/vashthestampede/32/10_2.png) [@VashTheStampede](https://forum.olinfo.it/u/VashTheStampede)\
**Post date:** [26 Aprile 2014, 10:36am UTC](https://forum.olinfo.it/t/problema-somma-pari-massima-v2-0/3792/4 "2014-04-26T10:36:55Z")

</div>

Comunque tutti quei controlli in lettura o apertura del file non ti servono per i problemi (viene sempre assicurato il rispetto dei limiti del problema).

In ogni caso non ti serve nemmeno un vettore, basta che pensi con quali categorie di numeri puoi ottenere una somma pari e lo risolvi in lettura 🙂

---

<div class="post-metadata">

**Author:** ![wil93](https://forum.olinfo.it/user_avatar/forum.olinfo.it/wil93/32/2862_2.png) [@wil93](https://forum.olinfo.it/u/wil93)\
**Post date:** [26 Aprile 2014, 11:29am UTC](https://forum.olinfo.it/t/problema-somma-pari-massima-v2-0/3792/5 "2014-04-26T11:29:18Z")

</div>

> Comunque tutti quei controlli in lettura o apertura del file non ti servono per i problemi (viene sempre assicurato il rispetto dei limiti del problema).
> 
> VashTheStampede

Sono d’accordo con te, in parte. Intanto, in generale, può essere una buona  
cosa che il proprio programma segnali in qualche modo che le assunzioni  
non vengono rispettate (ad esempio: quando vuoi eseguire un input creato  
a mano oppure un input gigante, generato automaticamente con un altro  
programma).  
  
Ho visto gente a volte che metteva un grosso **if (le assuzioni del problema sono rispettate) { tutto il programma }**  
e questo oltre ad essere inutile (perché se non vengono  
rispettate il tuo programma non fa nulla, come ti accorgerai che il tuo  
programma non ha fatto nulla _per colpa delle assunzioni?_) rende il programma poco leggibile dato che aumenta il livello d’indentazione del programma…

> If you need more than 3 levels of indentation, you’re screwed anyway, and should fix your program.
> 
> Linus Torvalds

Non prendiamo alla lettera le parole di Linus, che spesso esagera… comunque @Rob97  
quantomeno ha fatto una cosa un po’ più furba 🙂 ovvero, se non  
vengono rispettate le assunzioni fa uscire il programma con _exit code_  
uguale a -1 (quindi ha modo di accorgersi se le assunzioni non sono  
rispettate), altrimenti esegue il programma (quindi non sono aumentate  
le indentazioni).  
  
Tuttavia, l’idea di @Rob97 di usare l’exit code come indicatore è un “reinventare la ruota” dato che nella libreria **assert.h** è presente una funzione che fa esattamente quello, ovvero terminare il programma con exit code diverso da zero (ma **meglio**!).

```
if (n<1 || n>100000) {
return -1;
}
```

Con un semplice #include \<assert.h\> si può utilizzare la funzione assert(int) in questo modo:

```
assert(n>=1 && n<=100000);
```

La cosa migliore non è tanto il fatto che serva meno codice per scriverla, quanto che (se l’input non rispetta le assunzioni) assert scriverà a video un messaggio del tipo:

**prova: prova.cpp:6: int main(): Assertion `****n\>=1 && n\<=100000’ failed.  
[1]&nbsp;&nbsp;&nbsp; 3136 abort (core dumped)&nbsp; ./prova**

Ti dice esattamente l’asserzione fallita (n\>=1 && n\<=100000) e ti dice anche in quale riga si trova (6). Più chiaro di così!

P.S. Oltre a “passare ad assert”, @Rob97 farebbe bene ad utilizzare delle costanti, del tipo:

```
#defineMAXN 100000
```

In modo da dichiarare gli array con **int array[MAXN]** e da controllare le assunzioni con **assert(n\>=1 && n\<=MAXN)**.

Una volta ho visto qualcuno dichiarare l’array della dimensione giusta (100000) ma controllare le assunzioni del problema usando la dimensione sbagliata (10000), questi bug te li vai a cercare se non usi le costanti 🙂

P.P.S. Un’altra cosa comoda degli assert è che è sufficiente aggiungere in cima al proprio file.c/cpp (o comunque _prima di #include\<assert.h\>_) la riga:

```
#defineNDEBUG
```

che ha l’effetto di _ignorare_ automaticamente tutte le chiamate ad assert(), il che può essere comodo, ad esempio, quando si usano cose tipo **assert(controlla())** dove **controlla()** può essere una funzione molto lenta…
