Aiuto con bigsomma (1/100)

salve a tutti, sto provando a risolvere bigsomma ma non capisco come faccio a uscire di tempo… qualcuno che sa come posso risolvere??

grazie in anticipo!!

#include <iostream>
#include <cstdio>

using namespace std;

long long somma(FILE *f) {
    // leggi N
    int N;
    fscanf(f, "%d", &N);
    
    // leggi la sequenza e calcola la somma
    long long somma = 0;
    for (int i = 0; i < N; i++) {
        int valore;
        fscanf(f, "%d", &valore);
        somma += valore;
    }
    
    return somma;
}

Questo non è un problema di implementazione. É una gara a chi legge più veloce da file quindi ti sconsiglio di provare a risolverlo come faresti per i problemi normali.

Metodo alternativo: Una strategia, se proprio vuoi provarci, é stampare valori casuali finché non li azzecca tutti :grin:

Grazie!!!

Ciao!

Anche io stavo cercando di risolverlo, ho questa bozza di funzione che almeno in parte mi sembra poter funzionare e penso sia anche abbastanza veloce.

Ma già con i primi due esempi sulle submission sembra non andare, mentre localmente a me va, quindi mi risulta un pò difficile testarla, qualcuno saprebbe aiutare?

long long somma(FILE *f) {
    size_t max_buffer_size_first_line = 8 * sizeof(char);
    char first_line[max_buffer_size_first_line];
    fgets(first_line, max_buffer_size_first_line, f);
    int N = atoi(strtok(first_line, "\n"));

    size_t max_buffer_size_second_line = (9 + 1) * N * sizeof(char);
    char *second_line;
    size_t parts = 1;
    while (1) {
        second_line = malloc(max_buffer_size_second_line);
        if (second_line != NULL)
            break;
        else {
            max_buffer_size_second_line /= 2;
            parts++;
        }
    }

    long long sum = 0;
    for (size_t part = 0; part < parts; part++) {
        fgets(second_line, max_buffer_size_second_line, f);
        char *token = strtok(second_line, " ");
        do {
            sum += atoi(token);
            token = strtok(NULL, " ");
        } while (token != NULL);
    }
    fclose(f);

    return sum;
}

Ciao, non ho letto attentamente il tuo codice, comunque è impossibile prendere più di 2/100 (o forse 3/100) su questo problema usando in modo naive le funzioni della libreria standard (tipo fgets, atoi e strtok). Comunque non vale la pena di perdere troppo tempo dietro a questo problema, almeno secondo me.

Con fread si riesce ad arrivare a 5 punti:

#pragma GCC optimize ("O3") 
#include <stdio.h>
#include <cstdlib>

#define read1 25000000

long long somma(FILE *f) {
	unsigned int temp = 0; 
	bool neg = false;
	long long somma = 0;
	
	char *buffer = (char*)malloc(read1), *end;

	size_t x = fread(buffer,1,read1,f);
	end = buffer + x;
	
	do{
		buffer++;
	}while(*buffer>='0' and *buffer<='9');

	while(true){
		temp = 0; neg = false;
		if(x==0) break;
		while(*buffer<'0' or *buffer>'9'){
			if(*buffer=='-'){
				neg = true;
			}
			buffer++;
			if(buffer == end){
				buffer-=x;
				x = fread(buffer,1,read1,f);
				if(x==0) break;
				end = buffer + x;
			}
		}
		if(x==0) break;
		while(*buffer>='0' and *buffer<='9'){
			temp = temp*10 + (*buffer -'0');
			buffer++;
			if(buffer == end){
				buffer-=x;
				x = fread(buffer,1,read1,f);
				if(x==0) break;
				end = buffer + x;
			}
		}
		if(neg) somma-= temp;
		else	somma+= temp;
	}
	return somma;
}

Però va già quasi in tle nel sesto subtask