Cod sursa(job #264929)

Utilizator alex23alexandru andronache alex23 Data 22 februarie 2009 23:16:04
Problema Subsecventa de suma maxima Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.8 kb
#include <stdio.h>
#define NMAX 10000

//calculeaza subsecventa de suma minima si de lungime minima
//subsecventa -- pozitii consecutive


int a[NMAX], n;
int minim, li, ls;


int citire() // citire fisier intr-un vector de la 0 la n-1
 {
    FILE *f;

    f = fopen("citire.in","r");
    fscanf(f,"%d",&n);
    for (int i = 0; i < n; i++)
    {
        fscanf(f,"%d",&a[i]);
    }

    fclose(f);

    return 0;
 }

int rezolvare()
 { //minim - valoare minima
   //li - pozitia de inceput
   //ls - pozitia de sfarsit

  int pozst, pozsf;// pozitia de start si pozitia de final a sumei curente
  int suma;

  minim = a[0];
  suma = a[0];
  li = ls = 0;
  pozst = pozsf = 0;
  for (int i = 1; i < n; i++)
  {
      if (a[i] < 0)
      {
         if (suma >= 0)
         {
             suma = a[i];
             if (minim > a[i]) {minim = a[i]; li = ls = i;}
             pozst = pozsf = i;
         }
         else
         {
             pozsf = i;
             suma += a[i];
         }
      }
      if (a[i] >= 0)
      {
          if (suma >= 0)
          {
              if (minim > a[i]) {minim = a[i]; li = ls = i;}
              suma = a[i];
              pozst = pozsf = i;
          }
          else
          {
              if (minim > suma) {minim = suma; li = pozst; ls = pozsf;}
              if (suma + a[i] < 0) {suma += a[i]; pozsf =i;}
                              else {suma = a[i]; pozsf = pozst = i;}
          }
      }
  }

  if (minim > suma) {minim = suma; li = pozst; ls = pozsf;}

  return 0;
 }


int afisare()
 {
    FILE *f;
    f = fopen("afisare.out","w");
    fprintf(f,"%d %d %d",minim,li+1,ls+1);
    fclose(f);
    
    return 0; 
 }

int main()
 {
   citire();
   rezolvare();
   afisare();
   
   return 0;
 }