Cod sursa(job #742051)

Utilizator florin.uncuUncu Florin florin.uncu Data 28 aprilie 2012 00:16:41
Problema Buline Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.12 kb
// http://infoarena.ro/problema/buline

#include <stdio.h>
#include <malloc.h>

int main(int argc, char* argv[])
{
	long N;
	int *v, **dp, maxx, kp = 0, pp = 0, i, j, k;
	FILE *f = fopen("buline.in", "r");
	fscanf(f, "%d", &N);
	v  = (int*) malloc(N * 2 * sizeof(int));
	dp = (int**)malloc(N * sizeof(int*));
	int semn;
	for (i = 0; i < N; ++i)
	{
		dp[i] = (int*)malloc(N * sizeof(int));
		fscanf(f, "%d %d", &v[i], &semn);
		if(semn == 0) v[i] *= -1;
		v[i+N] = v[i];
		dp[i][0] = v[i];
	}
	maxx = v[0];
	fclose(f);

	for(k = 0; k < N; ++k) 
	{
		for (i = k + 1; i < N + k; ++i)
		{
			j = i - k;
			if(dp[k][j-1] > 0) 
			{
				dp[k][j] = dp[k][j-1] + v[i];
				if(maxx < dp[k][j]) 
				{
					maxx = dp[k][j];
					kp = k;
					pp = j;
				}
			}
			else 
			{
				dp[k][j] = v[i];
				if(maxx < dp[k][j]) 
				{
					maxx = dp[k][i];
					kp = k;
					pp = j;
				}
			}
		}
	}
	k = 1;
	while(true)
	{
		if(pp != 0 && dp[kp][pp] - v[kp+pp] != dp[kp][pp-1]) break;
		pp--;
		k++;
	}
	f = fopen("buline.out", "w");
	fprintf(f, "%d %d %d", maxx, pp + 1, k);
	fclose(f);
	return 0;
}