Cod sursa(job #23481)

Utilizator hellraizerChiperi Matei hellraizer Data 28 februarie 2007 20:30:09
Problema Secv Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
#include <stdio.h>

#define N_MAX 5001

int n,m,t[N_MAX],p[N_MAX];
long v[N_MAX],c[N_MAX];

void citire(){
	int bun;
	FILE *fin=fopen("secv.in","r");
	fscanf(fin,"%d",&n);
	for (int i=1;i<=n;i++){
		fscanf(fin,"%ld",&v[i]);
		bun=1;
		for (int j=1;j<=m;j++)
			if (c[j]==v[i])
				bun=0;
		if (bun)
			c[++m]=v[i];
	}
	fclose(fin);
}

void interclasare(int x,int m,int y){
	long b[N_MAX],k1=x,k2=m+1,k=0;
	while (k1<=m&&k2<=y)
		if (c[k1]<c[k2])
			b[++k]=c[k1++];
		else
			b[++k]=c[k2++];
	while (k1<=m)
		b[++k]=c[k1++];
	while (k2<=y)
		b[++k]=c[k2++];
	for (k1=1;k1<=k;k1++)
		c[x+k1-1]=b[k1];
}

void sortare(int x,int y){
	if (x!=y){
		int m=(x+y)/2;
		sortare(x,m);
		sortare(m+1,y);
		interclasare(x,m,y);
	}
}

void prelucrare(){
	sortare(1,m);
	long x=1;
	int j;
	for (int i=1;i<=n;i++)
		for (j=1;j<=x;j++)
			if (v[i]==c[j])
				if (t[j]==0||t[j]>t[j-1]+p[j]-p[j-1]||j==1){
					p[j]=i;
					if (j==1)
						t[j]=1;
					else
						t[j]=t[j-1]+p[j]-p[j-1];
					if (j==x){
						x++;
						break;
					}
				}
}

void afisare(){
	FILE *fout=fopen("secv.out","w");
	if (!t[m])
		fprintf(fout,"-1\n");
	else
		fprintf(fout,"%d\n",t[m]);
	fclose(fout);
}

int main(){
	citire();
	prelucrare();
	afisare();
	return 0;
}