Cod sursa(job #163647)

Utilizator runnaway90Oprescu Radu Constantin runnaway90 Data 22 martie 2008 14:51:34
Problema Wanted Scor 10
Compilator cpp Status done
Runda preONI 2008, Runda Finala, Clasa a 10-a Marime 1.37 kb
#include<stdio.h>

long a[220][3],p,q,maxx,i,n,j,aux,k,min,cont,sol[220];

long ab(long k)
{
	   if (k<0) return -k;
	   else     return k;
}

long max(long a,long b)
{
	if (a>b) return a;
	else 	return b;
}

int main()
{
    freopen("wanted.in","r",stdin);
    freopen("wanted.out","w",stdout);
    scanf("%ld",&n);
    for(i=1;i<=n;i++)
    {
		     scanf("%ld %ld",&p,&q);
		     if (p<0)
		     {
			a[i][0]=p+(-q);a[i][1]=p;a[i][2]=q;
		     }
		     else
		     {
			 a[i][0]=p+q;a[i][1]=p;a[i][2]=q;
		     }
    }
	min=2000000000;
    for (i=1;i<n;i++)
    {
      for (j=i+1;j<=n;j++)
      {
	      if (a[i][1]>a[j][1])
	      {
			    aux=a[i][0];a[i][0]=a[j][0];a[j][0]=aux;
			    aux=a[i][1];a[i][1]=a[j][1];a[j][1]=aux;
			    aux=a[i][2];a[i][2]=a[j][2];a[j][2]=aux;
	      }
      }
      k=ab(a[i][0]);
      if (k<min)
      {
	            min=k;
	            cont=i;
      }
    }
    sol[cont]=min;
    for (i=cont-1; i>0; i--) 
    {
        for(j=i+1;j<=cont;j++)
               sol[i]=max(sol[i],sol[j]+a[j][1]-a[i][1]+a[i][2]+a[j][2]);
        if (sol[i]>maxx)
           maxx=sol[i];
    }
    for (i=cont+1;i<=n;i++)
    {
	for (j=i-1;j>=cont;j--)
	    sol[i]=max(sol[i],sol[j]+a[i][1]-a[j][1]+a[j][2]+a[i][2]);
	if (sol[i]>maxx)
	   maxx=sol[i];
    }

    printf("%ld\n",maxx);
    
    return 0;
}