Cod sursa(job #500926)

Utilizator gvoicuVoicu Gabriel gvoicu Data 13 noiembrie 2010 18:55:52
Problema Subsecventa de suma maxima Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 2.57 kb
#include <stdlib.h>
#include <stdio.h>

long int theta_nn(long int *v,long int n,long int *st,long int *dr)
{

   long int i,j, sum, sum_max=0;

   for(i=0;i<n-1;i++)
   {
      sum = 0;
      for(j=i; j<n; j++)
      {
         sum+=v[j];
         if(sum > sum_max)
         {
            sum_max = sum;
            *st      = i;
            *dr      = j;
         }
      }
   }

   return sum_max;
}

typedef struct elemente
{
   int sum;
   int st;
   int dr;
} elemente;

elemente theta_nlgn(int v[], int n, int st, int dr)
{
   elemente primul, al_doilea;

   if(dr-st == 1)
   {
      elemente element_sum;
      element_sum.st = st;
      element_sum.dr = dr;
      element_sum.sum = v[st]+v[dr];
      return element_sum;
   }
   else if(st == dr)
   {
      elemente element_sum;
      element_sum.st = st;
      element_sum.dr = dr;
      element_sum.sum = v[st];
      return element_sum;
   }

   int m = (st+dr)/2;
   /*primul.st = st;
   primul.dr = m;
   al_doilea.st = m+1;
   al_doilea.dr = dr;*/

   primul    = theta_nlgn(v, n, st, m);
   al_doilea = theta_nlgn(v, n, m+1, dr);

   if((primul.sum + al_doilea.sum > primul.sum) && (primul.sum + al_doilea.sum > al_doilea.sum)
                    && (al_doilea.st - primul.dr == 1 ))
   {
     elemente element_suma;
     element_suma.st = primul.st;
     element_suma.dr = al_doilea.dr;
     element_suma.sum = primul.sum + al_doilea.sum;
     return element_suma;
   }
   else if(primul.sum > al_doilea.sum)
   {
      return primul;
   }
   else
   {
      return al_doilea;
   }
}

elemente theta_n(int v[], int n)
{
   int sum = 0, i;
   elemente best_element;
   best_element.st = 0;
   best_element.sum = -2000000;

   for(i=0; i<n; i++)
   {
      if(sum < 0)
      {
         sum = v[i];
         best_element.st = i;
         best_element.dr = i;
      }
      else
      {
         sum+=v[i];
      }

      if(best_element.sum < sum)
      {
         best_element.sum = sum;
         best_element.dr = i;
      }
   }
   return best_element;
}

int main()
{
   long int i,n=0, *v, sum=0, st=0, dr=0;
   FILE* in  = fopen("ssm.in", "r");
   FILE* out = fopen("ssm.out", "w");

   fscanf(in,"%ld", &n);
   printf("%ld\n", n);
   v = (long int*) malloc((sizeof(long int))*(n+1));
   for(i=0; i<n; i++)
   {
      fscanf(in, "%ld", &v[i]);
   }
   sum = theta_nn(v, n, &st, &dr);
   fprintf(stdout, "%ld %ld %ld", sum, st, dr);

   //elemente rez = nlgn(v,n,0,n-1);
   //printf("%d %d %d", rez.sum, rez.st, rez.dr);

   //elemente best = theta_n(v,n);
   //fprintf(out, "%d %d %d", best.sum, best.st, best.dr);

   fclose(in);
   fclose(out);

   return 0;
}