Cod sursa(job #123051)

Utilizator alex3el_n2oAlex Vladescu alex3el_n2o Data 14 ianuarie 2008 15:08:43
Problema Operatii Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.07 kb
#include <stdio.h>
FILE *f=fopen("operatii.in","r"), *g=fopen("operatii.out","w");
long v[1000002];
int main()
{
long op=0,t,tt,n,i,min,max;
int p=1,ord,k,s,o;
fscanf(f,"%ld",&n);
for (i=1;i<=n;++i)
	fscanf(f,"%ld",&v[i]);
t=0;
tt=0;
while (p)
{
	i=tt+1;
	if (o) i=1;
	t=0;
	tt=0;
	k=1;
	o=0;
	while ((k)&&(i<=n))
		{
		if ((v[i]>0)&&(!t)) {
			t=i;
			}
		if ((v[i]==0)&&(t)) {
			tt=i-1;
			}
		if ((t)&&(tt)) k=0;
		++i;
		}
	if ((t)&&(i==n+1)&&(tt==0)) tt=n;
	if (t>0)
	{
		min=v[t];
		max=v[t];
		if (v[t]>v[t+1]) ord=1;
		if (v[t]<v[t+1]) ord=0;
		s=1;
		for (i=t+1;i<=tt;++i)
			{
			if (v[i]<min) min=v[i];
			if (v[i]>max) max=v[i];
			if ((v[i]>v[i+1])&&(ord==0)&&(i<tt)) s=0;
			if ((v[i]<v[i+1])&&(ord==1)&&(i<tt)) s=0;
			}
		if (s)
			{
			for (i=t;i<=tt;i++)
				v[i]=0;
			op+=max;
			}
		else
		{
		op+=min;
		for (i=t;i<=tt;++i)
			{
			v[i]-=min;
			if ((v[i]>0)&&(v[i-1]==0)&&(v[i+1]==min))
				{
				op+=v[i];
				v[i]=0;
				}
			else o=1;
			}
		}
	}
	if (t==0) p=0;
}
fprintf(g,"%ld\n",op);
return 0;
}