Cod sursa(job #764556)

Utilizator maritimCristian Lambru maritim Data 5 iulie 2012 16:26:36
Problema Secv Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.37 kb
#include<stdio.h>
#include<algorithm>
using namespace std;

FILE *f = fopen("secv.in","r");
FILE *g = fopen("secv.out","w");

typedef struct
{
	int info,poz;
} numar;

typedef struct Compare
{
	bool operator () (const numar a,const numar b) { return a.info < b.info ;  }
} ICompare;

#define MaxN 5010
#define INF 9000000

int N,Nr,Max,Sol = INF,poz;
numar A[MaxN];
int Best[MaxN],B[MaxN],Poz[MaxN],SolV[MaxN];

void citire(void)
{
	fscanf(f,"%d ",&N);
	for(int i=1;i<=N;i++)
		fscanf(f,"%d ",&A[i].info);
}

void NumereUnice(void)
{
	numar C[MaxN];
	C[0].info = -1;
	
	for(int i=1;i<=N;i++)
		C[i].info = A[i].info,C[i].poz = i;
	
	sort(C+1,C+N+1,ICompare());
	
	for(int i=1;i<=N;i++)
	{
		if(C[i].info != C[i-1].info)
			++ Nr;
			
		A[C[i].poz].poz = Nr;
	}
}

void Rezolvare(void)
{
	NumereUnice();
	
	for(int i=1;i<=N;i++)
		SolV[i] = INF;
	
	for(int i=1;i<=N;i++)
	{
		if(A[i].poz == 1)
			Best[1] = 1, Poz[1] = i, SolV[1] = 1;
		else if(Best[A[i].poz-1] && (Best[A[i].poz] < Best[A[i].poz-1]+1 || (Best[A[i].poz] == Best[A[i].poz-1]+1 && SolV[A[i].poz] > i-Poz[A[i].poz-1]+1)))
			Best[A[i].poz] = Best[A[i].poz-1]+1, Poz[A[i].poz] = Poz[A[i].poz-1], SolV[A[i].poz] = i-Poz[A[i].poz]+1;
			
		//printf("%d -> %d %d %d\n",A[i].poz,Best[A[i].poz],Poz[A[i].poz],SolV[A[i].poz]);
	}
	
	Sol = SolV[Nr];
	
	if(Sol == INF)
		Sol = -1;
}

int main()
{
	citire();
	Rezolvare();
	
	fprintf(g,"%d\n",Sol);
}