Cod sursa(job #742056)

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

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

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

	bool sc = false;
	long r = 0;

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