Cod sursa(job #541331)

Utilizator andreioneaAndrei Onea andreionea Data 25 februarie 2011 00:18:37
Problema Subsecventa de suma maxima Scor 55
Compilator c Status done
Runda Arhiva educationala Marime 1.34 kb
#include<stdio.h>
#include<limits.h>
#define BUF_SIZE 11718*2
void read(char *filename, int *n, int **v)
{
	FILE *f = fopen(filename,"rb");
	int i;
	char *buf = (char*)malloc(BUF_SIZE);
	setbuf(f,buf);
	fscanf(f,"%d",n);
	*v = (int*) malloc(*n * sizeof(int));
	for(i = 0; i< *n; ++i)
		fscanf(f,"%d",(*v)+i);	
	fclose(f);
	free(buf);
}
void find(int *start, int *end,int *sum, int *v, int n)
{
	int st1, st2, dr1, dr2;
	int sum1 = -INT_MAX, sum2 = -INT_MAX,sumc;
	int m = n/2;
	*start = *end = n/2;
	if(n <= 0){
		*sum = -INT_MAX;
		return;
	}
	if(m > 0){
		find(&st1, &dr1, &sum1, v, m);
		find(&st2, &dr2, &sum2, v+m, n-m);
	}
	sumc = *(v+m);
	*sum = sumc;
	if(sum2 > sum1){
		sum1 = sum2;
		st1 = st2;
		dr1 = dr2;
	}
	
	for(dr2 = m+1; dr2 < n; ++dr2){
		sumc += *(v+dr2);
		if(sumc > *sum){
			*sum = sumc;
			*end = dr2;
		}
	}
	sumc = *sum;
	for(st2 = m-1; st2 >=0; --st2){
		sumc += *(v+st2);
		if(sumc > *sum){
			*sum = sumc;
			*start = st2;
		}
	}
	if(sum1 > *sum){
		*sum = sum1;
		*start = st1;
		*end = dr1;
	}
}

int main()
{
	int n, *v;
	int i;
	int start, end, sum;
	start = end = sum = 0;
	FILE *f = fopen("ssm.out","w");
	read("ssm.in",&n,&v);
	find(&start, &end, &sum, v, n);
	fprintf(f,"%d %d %d\n",sum, start+1, end+1);
	fflush(stdout);
	fclose(f);
	free(v);
	return 0;
}