Cod sursa(job #151182)

Utilizator RockManIzsak Istvan RockMan Data 7 martie 2008 21:31:35
Problema Secventa 2 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.43 kb
#include<stdio.h>
#include<malloc.h>
#define fin "secv2.in"
#define fout "secv2.out"

const int NMax=50001;

int N,K,Secv[NMax];
int RezInceput,RezSfarsit;

long RezSuma = 0;

void indata()
{
	FILE *f=fopen(fin,"r");
	fscanf(f,"%d%d",&N,&K);
	for(int i = 1; i <= N; i++)
		fscanf(f,"%d",Secv + i);
	fclose(f);
}
void solve()
{
	int *SecvTemp, SumTemp, InceputTemp, SfarsitTemp, SumTempMax, InceputTempMax, SfarsitTempMax, NSecvTemp;
	int TabelPN[3][NMax] = {0}, IndexTabel = 1, IndexTemp;
	int i,j;
	SumTemp = 0;
	for(i = 1; i <= N; i++)
	{
		TabelPN [0] [IndexTabel++] = Secv [i];
		if(Secv [i] >= 0)
		{
			TabelPN [1] [IndexTabel - 1] = i;
			j = i + 1;
			while(Secv [j] >= 0)
			{
				TabelPN [0] [IndexTabel] += Secv [j];
				j++;
			}
			TabelPN [2] [IndexTabel - 1] = j - 1;
		}
		else
		{
			TabelPN [1] [IndexTabel - 1] = i;
			j = i + 1;
			while(Secv [j] < 0)
			{
				TabelPN [0] [IndexTabel] += Secv [j];
				j++;
			}
			TabelPN [2] [IndexTabel - 1] = j - 1;
		}
	}
	IndexTabel--;
	for(i = 1; i <= IndexTabel; i++)
	{
		IndexTemp = i;
		SumTemp = TabelPN [0] [IndexTemp];
		InceputTemp = TabelPN [1] [IndexTemp];
		while(1)
		{
			SfarsitTemp = TabelPN [2] [IndexTemp];
			if ( TabelPN [0] [IndexTemp + 1] >= 0)
			{
				SumTemp += TabelPN [0] [++ IndexTemp];
			}
			else if ( TabelPN [0] [IndexTemp + 1] + TabelPN [0] [IndexTemp + 2] >= 0 && IndexTemp + 2 <= IndexTabel)
			{
				SumTemp += TabelPN [0] [++ IndexTemp];
				SumTemp += TabelPN [0] [++ IndexTemp];
			}
			else break;
		}
		if(SumTemp > SumTempMax)
		{
			SumTempMax = SumTemp;
			InceputTempMax = InceputTemp;
			SfarsitTempMax = SfarsitTemp;
		}
	}


/*
	for(i = 1; i <= N; i++)
	{
		NSecvTemp = N - i + 1;
		SecvTemp = (int *) malloc (NSecvTemp * sizeof(int));
		InceputTemp = i;
		SecvTemp [i] = Secv [i];
		for(j = i+1; j <= N; j++)
		{
			SecvTemp [j] = SecvTemp [j-1] + Secv [j];
			if(SecvTemp [j] > SumTemp)
			{
				SumTemp = SecvTemp [j];
				SfarsitTemp = j;
			}
		}
		if(SumTemp > SumTempMax)
		{
			SumTempMax = SumTemp;
			InceputTempMax = InceputTemp;
			SfarsitTempMax = SfarsitTemp;
		}
		SecvTemp = NULL;
	}*/
	RezSuma = SumTempMax;
	RezInceput = InceputTempMax;
	RezSfarsit = SfarsitTempMax;
}
void outdata()
{
	FILE *f=fopen(fout,"w");
	fprintf(f,"%d %d %ld", RezInceput, RezSfarsit, RezSuma);
	fclose(f);
}
int main()
{
	indata();
	solve();
	outdata();
	return 0;
}