Cod sursa(job #488333)

Utilizator marius21Petcu Marius marius21 Data 28 septembrie 2010 12:48:39
Problema Subsecventa de suma maxima Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
/*#include <cstdio>

FILE * fin = fopen("ssm.in","r");
FILE * fout = fopen("ssm.out","w");

int main()
{
    int n;
    fscanf(fin,"%d",&n);
    int best = 0;
    int pi=0;
    int max=-0x3f3f3f3f,pim,pfm;
    for (int i=0; i<n; i++)
    {
        int x;
        fscanf(fin,"%d",&x);
        if (best+x<x)
        {
            best=x;
            pi=i;
        } else
        best+=x;
        if (best>max)
        {
            max=best;
            pim=pi;
            pfm=i;
        }
    }
    fprintf(fout,"%d %d %d\n",max,pim+1,pfm+1);
    fclose(fin);
    fclose(fout);
    return 0;
}
*/
#include <cstdio>
#include <cstdlib>
#include <limits.h>

FILE *fin=fopen("ssm.in","r");
FILE *fout=fopen("ssm.out","w");

inline bool isgood(char c)
{
	return ((c<='9')&&(c>='0')||(c=='-'));
}

int main (int argc, char * const argv[]) {
	int n;
    fscanf(fin, "%d",&n);
	int smin=0;
	int psmin=-1;
	int spart=0;
	int max=INT_MIN;
	int pi=-1;
	int pf=-1;

	for (int i=0; i<n; i++)
	{
		int v=0;
		int sgn=1;
		char c;

		while (!isgood(c=fgetc(fin)));

		if (c=='-')
		{
			sgn=-1;
			c=fgetc(fin);
		}

		do {
			v=v*10+c-'0';
			c=fgetc(fin);
		}while (isgood(c));
		v*=sgn;

		spart+=v;
		if (spart-smin>max)
		{
			max=spart-smin;
			pi=psmin;
			pf=i;
		}
		if (spart<smin)
		{
			psmin=i;
			smin=spart;
		}
	}
	fprintf(fout, "%d %d %d\n",max,pi+2,pf+1);
	fclose(fin);
	fclose(fout);
    return 0;
}