Cod sursa(job #609622)

Utilizator maritimCristian Lambru maritim Data 22 august 2011 15:05:11
Problema Subsir 2 Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.4 kb
#include<stdio.h>

#define MaxN 5010

const int INF = 21903912;

int A[MaxN];
int BST[MaxN];
int TST[MaxN];
int BDR[MaxN];
int TDR[MaxN];
int N;

void citire(void)
{
	FILE *f = fopen("subsir2.in","r");
	
	fscanf(f,"%d",&N);
	for(int i=1;i<=N;i++)
		fscanf(f,"%d",&A[i]);
	
	fclose(f);
}

void solveStanga(void)
{
	int MAX;
	for(int i=1;i<=N;i++)
	{
		MAX = -INF;
		BST[i] = INF;
		for(int j=i-1;j;j--)
			if(A[j] <= A[i] && A[j] > MAX && BST[j] < BST[i])
			{
				MAX = A[j];
				BST[i] = BST[j] + 1;
				TST[i] = j;
			}
			else if(A[j] > MAX && A[j] <= A[i])
				MAX = A[j];
		if(BST[i] == INF)
			BST[i] = 1;
	}
}

void solveDreapta(void)
{
	int MIN;
	for(int i=N;i;i--)
	{
		MIN = INF;
		BDR[i] = INF;
		for(int j=i+1;j<=N;j++)
			if(A[j] >= A[i] && A[j] < MIN && BDR[j] < BDR[i])
			{
				MIN = A[j];
				BDR[i] = BDR[j] + 1;
				TDR[i] = j;
			}
			else if(A[j] < MIN && A[j] >= A[i])
				MIN = A[j];
		if(BDR[i] == INF)
			BDR[i] = 1;
	}
}

int FindMin(void)
{
	int MIN = INF;
	for(int i=1;i<=N;i++)
		if(BST[i] + BDR[i] - 1 < MIN)
			MIN = BST[i] + BDR[i] - 1;
	return MIN;
}

int main()
{
	FILE *g = fopen("subsir2.out","w");
	
	citire();
	solveStanga();
	solveDreapta();
	fprintf(g,"%d ",FindMin());
	for(int i=1;i<=N;i++)
		printf("%d ",BST[i]);
	printf("\n");
	for(int i=1;i<=N;i++)
		printf("%d ",BDR[i]);
	
	fclose(g);
	return 0;
}