Dopo essere stato alle prese con bigmassimo, ora sto provando a risolvere bigsomma.
Purtroppo però dopo innumerevoli sottopoizioni sbagliate/lente ho incontrato un problema mentre provavo a ottimizzare il codice. Originariamente leggevo il file con fread
, processavo tutti i caratteri con un pointer e mantenevo una variabile N per capire quando avevo letto tutti i numeri. Per evitare di utilizzare questa variabile ho poi provato a fermare la lettura quando il pointer è arrivato alla fine dell’input senza contare quanti numeri ho processato (posso capirlo dal valore ritornato da fread
, che restituisce il numero di byte letti).
Però continuo a ottenere output sbagliati ovunque tranne che nei testcase di esempio.
Ho scritto questo codice, che conta il numero di interi letti da fread:
#include <stdio.h>
#include <cstdlib>
using namespace std;
#define read1 250000020
long long somma(FILE *f) {
int N = 0;
char *dtp = (char*)malloc(read1), *eodt;
// provo a leggere 250 MB di dati
size_t retv = fread(dtp, 1, read1, f);
eodt = dtp + retv;
do {
N = 10*N + *dtp - '0';
dtp++;
} while (*dtp != '\n');
if (retv != (size_t)read1) {
// retv è il numero di byte letti, se è meno di 250 MB vuol dire che l'input è già finito e la funzione ha incontrato eof (end of file)
bool isdig, wasdig = false;
// numero di interi nell'input
int count = 0;
while (dtp != eodt) {
isdig = *dtp <= '9' && *dtp >= '0';
// inizio di un nuovo numero se incontro una cifra e il carattere precedente non era una cifra
if (isdig && !wasdig) count++;
wasdig = isdig;
dtp++;
}
// 0, in teoria
return count - N;
} else {
// fread non ha letto tutto l'input che eccede 250 MB, ignoro questo caso nei test per semplificarmi la vita
return 0;
}
}
Subtask 1 0/0
Testcase Risultato Dettagli Tempo Memoria
000 Not correct Incorrect, 0 instead of 17. 0.006s 376 KiB
001 Not correct Incorrect, 0 instead of -6. 0.006s 408 KiB
Subtask 2 0/1
Testcase Risultato Dettagli Tempo Memoria
002 Not correct Incorrect, 100 instead of 1777. 0.005s 488 KiB
003 Not correct Incorrect, 100 instead of -19439. 0.006s 504 KiB
004 Not correct Incorrect, 1000 instead of -192718. 0.006s 496 KiB
005 Not correct Incorrect, 1000 instead of 110546. 0.005s 504 KiB
006 Not correct Incorrect, 576 instead of -25448593. 0.061s 6.4 MiB
007 Not correct Incorrect, 576 instead of 237353679. 0.066s 6.8 MiB
008 Not correct Incorrect, 576 instead of -165373945. 0.070s 7.0 MiB
009 Not correct Incorrect, 576 instead of 57135729. 0.070s 7.3 MiB
010 Not correct Incorrect, 576 instead of 2006182231. 0.067s 7.3 MiB
011 Not correct Incorrect, 576 instead of -34066701623. 0.083s 9.3 MiB
Subtask 3 0/1
Testcase Risultato Dettagli Tempo Memoria
012 Not correct Incorrect, 640 instead of 898716261441. 0.717s 89.5 MiB
013 Not correct Incorrect, 640 instead of -688174453119. 0.722s 89.6 MiB
Subtask 4 0/1
Testcase Risultato Dettagli Tempo Memoria
014 Not correct Incorrect, 256 instead of 223844677247. 1.404s 178.9 MiB
015 Not correct Incorrect, 256 instead of 296792632615. 1.428s 178.6 MiB
Come si può vedere il numero di interi nell’input non coincide con N. Altra cosa che ho notato è che in alcuni testcase del subtask due ci sono esattamente gli stessi 100 numeri ripetuti due volte, infatti il mio codice restituiva sempre il doppio del risultato corretto. Qualcuno saprebbe spiegarmi perché incontro questo strano comportamento? Sto facendo qualche erroraccio nella lettura dell’input o è possibile che il numero di interi non coincida con N?