Buongiorno,
sono nuovo al linguaggio C++ e a questo tipo di problemi, quindi sono ancora alle basi.
Ho provato a risolvere “Super Mario” e il mio punteggio non va oltre a 90/100 e non capisco perché.
Questo è il mio codice, grazie in anticipo per il chiarimento:
#include <stdio.h>
#include <assert.h>
double scosse(int N) {
double volte = 0;
for (double i = N;i > 0;i--) {
volte = volte + (i-1)/2.0;
}
return volte;
}
int main() {
FILE *fr, *fw;
int N;
fr = fopen("input.txt", "r");
fw = fopen("output.txt", "w");
assert(1 == fscanf(fr, "%d", &N));
fprintf(fw, "%.6f\n", scosse(N));
fclose(fr);
fclose(fw);
return 0;
}
Il tuo codice va fuori tempo. Serve una soluzione più efficiente. Prova a pensare se c’è un modo per calcolare il risultato senza cicli… La media è (caso migliore + caso peggiore) / 2
. Il caso milgiore è banale: Non prende nessuna scossa. Il caso peggiore è che prenda tutte le scosse possibili che sono al primo turno N-1
, al secondo N-2
etc. C’è un modo per calcolare questo senza un ciclo for
? Sommatoria di Gauss. Se hai domande chiedi pure.
Per prima cosa grazie perché effettivamente il codice poteva essere molto più semplice e il tuo consiglio mi ha aiutato molto. Ho provato a cambiarlo e mi sembrava di aver trovato una soluzione corretta, invece continua a darmi 90/100 e non capisco perché .
#include <stdio.h>
#include <assert.h>
double scosse(int N) {
return (N*(N-1))/4.0;
}
int main() {
FILE *fr, *fw;
int N;
fr = fopen("input.txt", "r");
fw = fopen("output.txt", "w");
assert(1 == fscanf(fr, "%d", &N));
fprintf(fw, "%.6f\n", scosse(N));
fclose(fr);
fclose(fw);
return 0;
}
Grazie in anticipo per l'aiuto
Volendo puoi non dichiarare la funzione, ma puoi semplicemente dichiarare N come float e scrivere la risposta come N=N(N-1)/4
Il template è sbagliato. N dovrebbe essere un long long int