Cod sursa(job #137576)

Utilizator runnaway90Oprescu Radu Constantin runnaway90 Data 17 februarie 2008 12:43:14
Problema Carnati Scor 10
Compilator c Status done
Runda preONI 2008, Runda 4, Clasa a 10-a Marime 1.41 kb
#include<stdio.h>
#include<string.h>
long maxim,*p,a[2000],b[2000],d[2000],n,c,i,j;

void sort(int l,int r)
{int i,j,x,y;
     i=l;j=r;x=a[(l+r)/2];
     do
     {
			  while (a[i]<x) i++;
			  while (a[j]>x) j--;
                          if (i<=j)
                          {
                                   y=a[i];a[i]=a[j];a[j]=y;
                                   y=b[i];b[i]=b[j];b[j]=y;
				   i++;j--;
			  }
     }while (i<=j);
     if (l<j) sort(l,j);
     if (i<r) sort(i,r);
}

void verif(long nr,long b[2000])
{int i,j,w;
     for(i=1;i<=n;i++)
     {
	  if (b[i]>=nr)
	  {
		if (nr-c>maxim)
		{
		maxim=nr-c;
		}
		j=i-1;
		while (b[j]<0) j--;
		if (b[j]>0)
		{
			if ((b[j]+nr)-(a[i]-a[j])*c>b[i])
			b[i]=(b[j]+nr)-(a[i]-a[j])*c;
			if ((b[j]+nr)-(a[i]-a[j])*c>maxim)
			{
				maxim=(b[j]+nr)-(a[i]-a[j])*c;
				b[i]=maxim;
			}
                }
		else
		b[i]=nr-c;

	  }
	  else
	  b[i]=-1;
     }

}


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

int main()
{
    freopen("carnati.in","r",stdin);
    freopen("carnati.out","w",stdout);
    scanf("%ld %ld",&n,&c);
    for (i=1;i<=n;i++)
        scanf("%d %d",&a[i],&b[i]);
    sort(1,n);
    
    for (i=1;i<=n;i++)
    {
	for(j=1;j<=n;j++)
	d[j]=b[j];

	verif(b[i],d);
    }
    
    
    printf("%ld\n",maxim);
    return 0;
}