Cod sursa(job #1436833)

Utilizator stoianmihailStoian Mihail stoianmihail Data 16 mai 2015 15:17:35
Problema Subsecventa de suma maxima Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 2.32 kb
/// Bibliotecile care ne trebuiesc
#include <stdio.h>                   /// pentru fscanf() + fprintf() + printf()
#include <limits.h>                  /// pentru INT_MIN
#include <ctype.h>                   /// pentru isdigit()
/// Constantele care ne trebuiesc
#define Dragoste 4096
/// Variabilele care ne trebuiesc
int  n;                              /// numarul de elemente
int  i;                              /// un index
int  b;                              /// inceputul subsecventei
int  num;                            /// citim numar cu numar
int  sum;                            /// suma la un moment dat
int  bMax;                           /// inceputul subsecventei maxime
int  eMax;                           /// sfarsitul subsecventei maxime
int  maxSum;                         /// suma maxima
int  pos = Dragoste;                 /// pozitia in buff[]
char c;                              /// un caracter
char sign;                           /// semnul numarului
char buff[Dragoste];                 /// bufferul oferit de sistem
/// un fel de fgetc()
inline char getChar(FILE *f) {
    if(pos == Dragoste) {
        fread(buff, 1, Dragoste, f);
        pos = 0;
    }
    return buff[pos++];
}
/// un fel de fscanf()
inline void scanFile(FILE *f, int *result) {
    *result = 0;
    c = '+';
    do {
        sign = c;
        c = getChar(f);
    } while (!isdigit(c));
    do {
        *result = (*result << 3) + (*result << 1) + c - '0';
        c = getChar(f);
    } while(isdigit(c));
    if (sign == '-') {
        *result = -*result;
    }
}
/// int main()
int main() {
    /// deschidere fisier de intrare
    FILE *f = fopen("ssm.in", "r");
    sum = -1;
    maxSum = INT_MIN;
    /// citim parsat datele de intrare
    scanFile(f, &n);
    for (i = 0; i < n; i++) {
        scanFile(f, &num);
        /// daca suma e negativa
        if (sum < 0) {
            sum = 0;
            b = i;
        }
        /// recalculam suma + retinem suma maxima
        sum += num;
        if (sum > maxSum) {
            maxSum = sum;
            bMax = b;
            eMax = i;
        }
    }
    fclose(f);
    /// afisam rezultatul + mereu linie noua
    f = fopen("ssm.out", "w");
    fprintf(f, "%d %d %d\n", maxSum, bMax + 1, eMax + 1);
    fclose(f);
    /// Multumim Doamne!
    printf("Hristos a inviat!");
    /// dai return 0
    return 0;
}