Cod sursa(job #500841)

Utilizator Iceman_ftgBurghelea Alex Iceman_ftg Data 13 noiembrie 2010 12:07:50
Problema Subsecventa de suma maxima Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 1.29 kb
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>

void secv_n(long *data,long n,FILE *out)
{
    /*
     * retine pana la pozitia i care este cea mai
     * mare suma posibila . pe pozitia i se alege maximul dintre
     * elementul de pe pozia i din secventa originala si suma
     * dintre element si suma precedenta. cc
     */
    long int *vect = (long int *) malloc((n+1)*sizeof(long int));
    long int *poz =  (long int *) malloc((n+1)*sizeof(long int));
    long int max,i,ii=0,jj=0;
    max = data[1];
    vect[0]=0;
    poz[0]=1;
    int l_max = INT_MAX;
    for (i=1;i<=n;i++)
    {
        vect[i]=data[i];
        poz[i]=i;
        if(vect[i]<(vect[i-1]+data[i]))
        {
            vect[i]=vect[i-1]+data[i];
            poz[i]=poz[i-1];
        }
        if(max<vect[i] && l_max>(i-poz[i]+1))
        {
            max=vect[i];
            ii=poz[i];
            jj=i;
            l_max=i-poz[i]+1;
        }
    }
    fprintf(out,"%ld %ld %ld",max,ii,jj);
}
int main ()
{
    long int n,*vect,i;

    FILE *fid = fopen("ssm.in","r");
    FILE *foid = fopen("ssm.out","w");

    fscanf(fid,"%ld",&n);
    vect = (long int*) malloc(sizeof(long int)*(n+1));
    for (i=1;i<=n;i++)
        fscanf(fid,"%ld",&vect[i]);




    secv_n(vect,n,foid);
    fclose(fid);
    fclose(foid);
    return 0;
}