Cod sursa(job #629701)

Utilizator alex280487Alex V alex280487 Data 3 noiembrie 2011 19:53:56
Problema Subsecventa de suma maxima Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.88 kb
#include <iostream>
#include <stdio.h>

#define PRINT(x,N) do { for (int i = 0 ; i < N ; i ++) cout << x[i] << " "; cout << endl; } while(0);

using namespace std;

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];
  st = new int [N];
  dr = new int [N];
  take = new bool [N];

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

  dr[0] = vec[0];
  for(int i = 1 ; i < N ; i ++)
    dr[i] = (dr [i - 1] + vec[i]) > vec[i] ? (dr [i - 1] + vec[i]) : vec[i];

  int max = 0;
  int poz;

  for (int i = 0; i < N ; i ++)
    if (max < dr[i])
    {
      max = dr[i];
      poz = i;
    }

//  PRINT(dr,N);
//  cin.get();
  int end = poz;
  int suma = max;
  while (max > 0)
  {
    max -= vec[poz];
    poz --;
  }

  int start = poz;

  fprintf(g, "%d %d %d\n", suma, start + 2, end + 1);
/*
  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);
*/
  delete [] vec;
  delete [] st;
  delete [] dr;
  delete [] take;

  fclose(f);
  fclose(g);

//  cin.get();

  return 0;
}