Pagini recente » Cod sursa (job #940349) | Cod sursa (job #2658859) | Cod sursa (job #467986) | Cod sursa (job #2626214) | Cod sursa (job #151205)
Cod sursa(job #151205)
#include<stdio.h>
#include<malloc.h>
#define fin "secv2.in"
#define fout "secv2.out"
int N,K,Secv[50001];
int RezInceput,RezSfarsit;
long RezSuma;
void citire()
{
int i;
FILE *f=fopen(fin,"r");
fscanf(f,"%d%d",&N,&K);
for(i = 1; i <= N; i++)
fscanf(f,"%d",Secv + i);
fclose(f);
}
void solutie()
{
int SumTemp, InceputTemp, SfarsitTemp, SumTempMax, InceputTempMax, SfarsitTempMax;
int TabelPN[3][50001], IndexTabel, IndexTemp;
int i,j;
SumTemp = 0;
IndexTabel = 1;
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) ||
( SfarsitTemp < K ))
{
SumTemp += TabelPN [0] [++ IndexTemp];
SumTemp += TabelPN [0] [++ IndexTemp];
}
else break;
}
if(SumTemp > SumTempMax)
{
SumTempMax = SumTemp;
InceputTempMax = InceputTemp;
SfarsitTempMax = SfarsitTemp;
}
}
RezSuma = SumTempMax;
RezInceput = InceputTempMax;
RezSfarsit = SfarsitTempMax;
}
void afisare()
{
FILE *f=fopen(fout,"w");
fprintf(f,"%d %d %ld", RezInceput, RezSfarsit, RezSuma);
fclose(f);
}
int main()
{
citire();
solutie();
afisare();
return 0;
}