Cod sursa(job #5208)

Utilizator MarcvsHdrMihai Leonte MarcvsHdr Data 10 ianuarie 2007 22:50:16
Problema Secv Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.52 kb
# include <stdio.h>

const int MAXN=5000,infinit=-1,MAXLAYER=5000;
int n;
long int v[MAXN+1],elemmax;
struct {long int inf; int id;} save[MAXN+1];

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

void quick(int li, int lf)
{
int ii,jj,i,j,aux;long int auxxp;
i=li,j=lf,ii=0,jj=-1;
while (i<j)
	{
	if (save[i].inf>save[j].inf)
		{
		auxxp=save[i].inf;save[i].inf=save[j].inf;save[j].inf=auxxp;
		aux=save[i].id; save[i].id=save[j].id;  save[j].id=aux;
		aux=ii;ii=-jj;jj=-aux;
		}
	i+=ii;j+=jj;
	}
if (i-li>1) quick(li,i-1);
if (lf-i>1) quick(i+1,lf);
}

void transforma()
{
int i,k;
for (i=1;i<=n;i++) {save[i].inf=v[i];save[i].id=i;}
quick(1,n);
k=1;v[save[1].id]=k;
for (i=2;i<=n;i++)
	{
	if (save[i-1].inf!=save[i].inf) k++;
	v[save[i].id]=k;
	}
elemmax=k;
}

void scrie(int x) {FILE *g=fopen("secv.out","w");fprintf(g,"%d\n",x);fclose(g);}

int search()
{
int sol=infinit,i;
struct {int penalty,coord;} layers[MAXLAYER+1];
for (i=1;i<=n;i++) layers[i].penalty=layers[i].coord=infinit;
for (i=n;i>=1;i--)
	{
	if (v[i]==elemmax) {layers[elemmax].coord=i;layers[elemmax].penalty=1;}
	else if (layers[v[i]+1].coord!=infinit)
		{
		layers[v[i]].penalty=layers[v[i]+1].penalty+layers[v[i]+1].coord-i;
		layers[v[i]].coord=i;
		}
	if (v[i]==1) if (sol>layers[1].penalty||sol==infinit) sol=layers[1].penalty;
	}
return sol;
}

int main()
{
citire();
transforma();
int sol=search();
scrie(sol);
return 0;
}