Cod sursa(job #500842)

Utilizator Iceman_ftgBurghelea Alex Iceman_ftg Data 13 noiembrie 2010 12:20:49
Problema Subsecventa de suma maxima Scor 65
Compilator c Status done
Runda Arhiva educationala Marime 1.57 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 = -1;
    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] )
        {
            
            if (max==vect[i] && l_max>(i-poz[i]+1))
            {
                ii=poz[i];
                jj=i;
                l_max=i-poz[i]+1;
            }
            max=vect[i];
            if (l_max==-1)
            {
                ii=poz[i];
                jj=i;
            }
        }
    }
    for(i=1;i<=n;i++)
    {
        fprintf(stdout,"%ld  %ld \n",vect[i],poz[i]);
        
    }

    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;
}