Cod sursa(job #721293)

Utilizator okros_alexandruOkros Alexandru okros_alexandru Data 23 martie 2012 15:42:34
Problema Secv Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.09 kb
#include <fstream>
#include <algorithm>
#define NMAx 5100
using namespace std;

int N,Nr,A[NMAx],B[NMAx],Best[NMAx],T[NMAx];

inline int Length(int i) {
	
	if(Best[i]==1)
		return 1;
	else
		return Length(T[i])+i-T[i];
	
}
void Solve() {
	
	int i,j;
	
	for(i=1;i<=N;i++) {
		
		Best[i]=1;
		T[i]=i;
		
		for(j=i-1;j>=1;j--)
			if(A[j]<A[i]) {
			
				if(Best[j]+1>Best[i]) {
					Best[i]=Best[j]+1;
					T[i]=T[j];
					}
				else
				if(Best[j]+1==Best[i]&&T[i]<T[j])
					T[i]=T[j];
				
				}
		}
	
}
void Normalizare() {
	
	int i;
	
	sort(B+1,B+N+1);
	for(i=1;i<=N;i++)
		if(B[Nr]!=B[i])
			B[++Nr]=B[i];
		
}
void Citire() {
	
	ifstream in("secv.in");
	in>>N;
	
	for(int i=1;i<=N;i++) {
		in>>A[i];
		B[i]=A[i];
		}
	
	in.close();
	
}
void Afis() {
	
	int i,Sol;
	
	Sol=NMAx;
	for(i=1;i<=N;i++)
		if(Best[i]==Nr)
			if(Length(i)<Sol)
				Sol=Length(i);
	
	if(Sol==NMAx)
		Sol=-1;
	ofstream out("secv.out");
	out<<Sol<<'\n';
	out.close();
	
}
int main() {
	
	Citire();
	
	Normalizare();
	Solve();
	
	Afis();
	
	return 0;
	
}