Cod sursa(job #629722)

Utilizator alex280487Alex V alex280487 Data 3 noiembrie 2011 20:45:50
Problema Subsecventa de suma maxima Scor 65
Compilator cpp Status done
Runda Arhiva educationala Marime 1.53 kb
#include <stdio.h>

int main (void)
{
  FILE *f = fopen ("ssm.in", "rt");
  FILE *g = fopen ("ssm.out", "wt");

  int N;
  int *vec, *st, *dr;
  bool *take;

  fscanf(f,"%d",&N);
  
  vec = new int [N];

  for (int i = 0 ; i < N ; i ++)
    fscanf(f, "%d", &vec[i]);

  int maxSum = -999999;
  int poz = 0,start,end;
  int prev = vec[0];
  for(int i = 1 ; i < N ; i ++)
  {
    if(prev < 0)
    {
      prev = vec[i];
      poz = i;
    }
    else 
    {
      prev += + vec[i];
      if (maxSum < prev)
      {
        maxSum = prev;
        end = i;
        start = poz;
      }
    }
  }

  fprintf(g, "%d %d %d\n", maxSum, start + 1, end + 1);

//  PRINT(dr,N);
//  cin.get();

/*
  st[N - 1] = vec[N - 1];
  for (int i = N - 2 ; i >=0 ; i --)
    st[i] = st[i + 1] + vec[i];

  take[0] = vec[0] >= 0;
  take[N - 1] = vec[N - 1] >= 0;

  for (int i = 1 ; i < N - 1; i ++)
    if (dr[i - 1] <= dr[i + 1] && st[i - 1] >= st[i + 1] || vec[i] >= 0)
      take[i] = true;
    else
      take[i] = false;

  int maxIndex = 0;
  int maxEnd = 0;
  int maxSum = 0;

  for (int i = 0 ; i < N ; i ++)
  {
    int sum = 0;
    int index = i;
    while (i < N && take[i]) 
    {
      sum += vec[i];
      i ++;
    }

    if (sum > maxSum)
    {
      maxSum = sum;
      maxIndex = index + 1;
      maxEnd = i;
    }
  }

  fprintf(g, "%d %d %d\n", maxSum, maxIndex, maxEnd);

  PRINT(vec, N);
  PRINT(st, N);
  PRINT(dr, N);
  PRINT(take, N);
*/

//  cin.get();

  return 0;
}