Aiuto ois truffa

buonsera a tutti, mi sapreste dire perchè non riesco a totalizzare 100/100? in particolare mi esce execution timed out solamente l’ultimo test dell’ultimo subtask.
Grazie in anticipo.

#include <stdio.h>
#include <assert.h>

#define MAXN 100000


int sommas(int V[], int N){
   
    int somma=0;
    int i;
  
    for(i=0;i<N;i++){
        somma+=V[i];
    }
    return somma;
   
}


void ordina(int array[],int n){


  for (int interval = n / 2; interval > 0; interval /= 2) {
    for (int i = interval; i < n; i += 1) {
      int temp = array[i];
      int j;
      for (j = i; j >= interval && array[j - interval] > temp; j -= interval) {
        array[j] = array[j - interval];
      }
      array[j] = temp;
    }
  }
}

int sfangate(int N, int V[]){
  
    if(sommas(V,N)==0)
        return 1;
    ordina(V,N);
    if(V[0]>0)
        return 0;
    
   int i;
    for(i=0;sommas(V,N)<=0 && i<N;i++){
        V[i]=V[i]*-1;

    }
    return i;
    
}

int V[MAXN];

int main() {
    FILE *fr, *fw;
    int N, i;

    fr = fopen("input.txt", "r");
    fw = fopen("output.txt", "w");
    assert(1 == fscanf(fr, "%d", &N));
    for(i=0; i<N; i++)
        assert(1 == fscanf(fr, "%d", &V[i]));

    fprintf(fw, "%d\n", sfangate(N, V));
    fclose(fr);
    fclose(fw);
    return 0;
}

Sto facendo fatica a capire cosa faccia il tuo codice, ma se non ti passa solo l’ultimo sottotest per limiti di tempo direi proprio che devi rivederti quest’ultima parte:

int i;
for(i=0;sommas(V,N)<=0 && i<N;i++){
    V[i]=V[i]*-1;
}

Stai ricalcolando le somme troppe volte

Inoltre per ordinare vettori guardati la funzione sort della STL

ma da completo ignorante, sort non si potrebbe usare con gli array statici giusto?
cmq l’intento del mio codice era prima calcolare la somma di tutto l’array, se la somma era positiva, il programma finiva li, altrimenti bisognava spostare gli elementi negativi trasformandoli in positivo, fino a che la somma totale non fosse maggiore di zero, quindi io ho ordinato il vettore in modo da prendere il numero negativo piu piccolo(che è il piu grande se visto col segno piu) e poi lo trasformavo in positivo, fino a che, appunto, la somma totale fosse positiva e non piu negativa.

In realtá puoi usare sort sugli array statici cosí:

sort(V, V+N);

Il ragionamento per risolvere il problema lo hai azzeccato, peró nell’implementazione ti devi accorgere di una cosa, se trasformi un numero negativo es. -1000 in positivo ovvero +1000 nella realtá dei fatti hai cambiato il bilancio di 2000.

Poi non vorrei dire una cavolata, ma se nel for scrivi sommas(V,N), questi richiamerá la funzione ogni volta… ti converebbe salvarti il bilancio totale in una variabile apposita e aggiornare quella.

Spero di essere stato chiaro!

ok grazie mille, ora provo e poi ti faccio sapere

Grazie mille mi hai risolto completamente il problema

Nessun problema, se mi segni la mia risposta come soluzione mi fai un favore :wink: