Cod sursa(job #124840)

Utilizator hellraizerChiperi Matei hellraizer Data 20 ianuarie 2008 00:09:11
Problema Secv Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.15 kb
#include <stdio.h>
#include <stdlib.h>

#define INF 5001

struct element{
	int val,p;
}s2[5001];

int N,k,a[5001],v[5001],poz[5001],s[5001],loc[5001];

int compare(const void *a, const void *b){
	element *x=(element *) a;
	element *y=(element *) b;
	return ( (x->val)-(y->val));
}

void citire(){
	int i;
	FILE *fin=fopen("secv.in","r");
	fscanf(fin,"%d",&N);
	for (i=1;i<=N;i++){
		fscanf(fin,"%d",&s[i]);
		s2[i].val=s[i];
		s2[i].p=i;
	}
	fclose(fin);
}

void prelucrare(){
	int i;
	qsort(s2,N+1,sizeof(element),compare);
	for (i=1;i<=N;i++){
		if (s2[i].val!=s2[i-1].val){
			a[++k]=s2[i].val;
			v[k]=INF;
			poz[k]=INF;
		}
		loc[s2[i].p]=k;
	}
	for (i=1;i<=N;i++)
		if (loc[i]==1){
			v[1]=1;
			poz[1]=i;
		}
		else
			if (v[loc[i]-1]!=INF)
				if (loc[i]==k){
					if (v[loc[i]-1]+i-poz[loc[i]-1]<v[loc[i]])
						v[loc[i]]=v[loc[i]-1]+i-poz[loc[i]-1];
				}
				else{
					poz[loc[i]]=i;
					v[loc[i]]=v[loc[i]-1]+i-poz[loc[i]-1];
				}
}

void afisare(){
	FILE *fout=fopen("secv.out","w");
	fprintf(fout,"%d\n",v[k]);
	fclose(fout);
}

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