riprendiamo l'esempio utilizzato in precedenza, preoccupandoci di effetuare i test case leggendo i dati da file e stampamdo l'output su file
Festa canina
Mojito, il cane di Monica, vuole organizzare una festa con i suoi amici. Aiutalo a scegliere quali invitare e quali escludere in modo da rendere la festa più bella possibile.
Dettagli:
Mojito ha N amici, ognuno dei quali ha un grado di amicizia A i che indica quanto Mojito apprezzi la sua presenza. Ovviamente nella lista c'è anche qualche antipatico che quindi ha un grado di amicizia negativo.
La bellezza della festa è definita come la somma del grado di amicizia degli invitati. Quanto può valere al massimo questa somma?
Assunzioni
T=6, sono presenti 6 casi di input.
1≤N≤10.000, il numero di amici di Mojito.
−100≤A i ≤100, il grado di amicizia dell'ii-esimo amico.
È anche possibile che Mojito festeggi senza amici, in tal caso la festa ha valore 00.
Dati di input
La prima riga del file di input contiene un intero T, il numero di casi di test. Seguono T casi di test, numerati da 1 a T. Ogni caso di test è preceduto da una riga vuota.
In ciascun caso di test, la prima riga contiene l'unico intero N.
La seconda riga contiene gli N interi separati da spazi, A i .
Dati di output
Il file di output deve contenere la risposta ai casi di test che sei riuscito a risolvere. Per ogni caso di test che hai risolto, il file di output deve contenere una riga con la dicitura:
Case #t: k
dove t è il numero del caso di test (a partire da 1) e k è il massimo valore di bellezza ottenibile.
Esempi di input/output
Input:
2
8
1 -4 5 -2 -1 8 0 1
3
-1 -2 -4
Output:
Case #1: 15
Case #2: 0
Spiegazione
Nel primo caso d'esempio la soluzione si ottiene invitando il primo, il terzo, il sesto, il settimo e l'ottavo amico, totalizzando una somma di 15.
Nel secondo caso d'esempio la soluzione si ottiene non invitando alcun amico, totalizzando quindi 0.
codice base: consideriamo un solo test case
in questo esempio è sufficiente un solo puntatore a file perchè input.txt e output.txt non sono gestiti contemporanemente.
il file input.txt contiene:
8
1 -4 5 -2 -1 8 0 1
dove la prima riga è l'intero N, la riga successiva contiene gli N valori Ai
MOLTO IMPORTANTE sono state tolte tutte le istruzioni che possono bloccare l'esecuzione (printf, scanf, getch(), system("pause"):..)
#include <stdio.h>#include <stdlib.h>FILE *f; main() {int N,A,i,acc=0; f=fopen("input.txt","r"); fscanf(f,"%d",&N); for(i=1;i<=N;i++) {fscanf(f,"%d",&A); if(A>0) acc+=A;} fclose(f); f=fopen("output.txt","w");
fprintf(f,"%d",acc); fclose(f); }
codice completo: ora consideriamo il problema completo, che deve eseguire T test case, generando T output nella forma "Case #num: valore".
il file input.txt contiene:
2
8
1 -4 5 -2 -1 8 0 1
3
-1 -2 -4
DA NOTARE che in questo caso devo usare due puntatori a file, perché il file per l'input e per l'output sono gestiti contemporaneamente: quando calcolo un valore di test case lo stampo e leggo i dati successivi da file di input.
#include <stdio.h>#include <stdlib.h>FILE *fin; FILE *fout; main() {int T,N,A,c,i,acc; fin=fopen("input.txt","r"); fout=fopen("output.txt","w"); fscanf(fin,"%d",&T); for(c=1; c<=T; c++) {acc=0; fscanf(fin,"%d",&N); if(N>0) //ci sono amici {for(i=1;i<=N;i++) {fscanf(fin,"%d",&A); if(A>0) acc+=A;} fprintf(fout,"Case #%d: %d\n",c,acc);} else fprintf(fout,"Case #%d: 00\n",c);}//festeggia da solo fclose(fin); fclose(fout); }
si è inoltre tenuto conto dell'assunzione per cui Moijto potrebbe festeggiare senza amici e quindi il test case deve produrre 00.
Per provare anche il caso particolare sopra evidenziato, aggiungo un test case al file di input, che diventa:
3
8
1 -4 5 -2 -1 8 0 1
3
-1 -2 -4
0