Pagini recente » Cod sursa (job #1445626) | Cod sursa (job #2101853) | Cod sursa (job #1246233) | Cod sursa (job #2885333) | Cod sursa (job #142717)
Cod sursa(job #142717)
#include <stdio.h>
#include <string.h>
#define fin "carnati.in"
#define fout "carnati.out"
const int Nmax = 2010;
struct inf
{
int timp;
long cst;
};
int N;
inf v[Nmax];
long C,best;
long a[Nmax];
inline long max(long a,long b) { return (a>b)?(a):(b); }
void quicksort(int st,int dr)
{
int m,i,j;
inf aux;
m = (st + dr) / 2;
i = st; j = dr;
do
{
while ( v[i].timp < v[m].timp ) ++i;
while ( v[j].timp > v[m].timp ) --j;
if ( i <= j )
{
aux = v[i];
v[i] = v[j];
v[j] = aux;
++i;
--j;
}
} while ( i < j );
if ( i < dr ) quicksort(i,dr);
if ( j > st ) quicksort(st,j);
}
void readsolve()
{
int i,j,flag;
long pret,aux = 0;
freopen(fin,"r",stdin);
freopen(fout,"w",stdout);
scanf("%i%ld",&N,&C);
for ( i = 1; i <= N; ++i )
scanf("%i%ld",&v[i].timp,&v[i].cst);
quicksort(1,N);
best = v[1].cst - C;
v[0].timp = v[1].timp - 1;
v[N+1].timp=-1;
for ( i = 1; i <= N; ++i )
{
pret = v[i].cst;
memset(a,0,sizeof(a));
for ( j = 1; j <= N; ++j )
{
flag = 0;
if ( v[j].timp == v[j+1].timp )
{
if ( v[j].timp != v[j-1].timp )
aux = a[j-1] - (v[j].timp-v[j-1].timp)*C;
if ( v[j].cst >= pret )
aux += pret;
flag = 1;
}
else
if ( v[j].timp == v[j-1].timp )
{
a[j] = max(aux,0);
flag = 1;
}
if ( flag )
continue;
if ( v[j].cst >= pret )
{
a[ j ] = max(a[j-1]-(v[j].timp-v[j-1].timp)*C+pret,pret-C);
a[ j ] = max(a[ j ], 0);
}
else
a[ j ] = max(a[j-1]-(v[j].timp-v[j-1].timp)*C,0);
}
for ( j = 1; j <= N; ++j )
best = max(best,a[j]);
}
printf("%ld\n",best);
}
int main()
{
readsolve();
return 0;
}