Pagini recente » Cod sursa (job #1422271) | Cod sursa (job #2594812) | Cod sursa (job #2867439) | Cod sursa (job #2582591) | Cod sursa (job #138228)
Cod sursa(job #138228)
#include <stdio.h>
int n, c;
int t[2001], p[2001];
int i, j, k;
int prof = 0;
void Cbin(int st, int dr);
void Qsort(int st, int dt);
int Ok(int pret);
int Max(int i, int j) { return i > j ? i : j; }
int main()
{
freopen("carnati.in", "r", stdin);
freopen("carnati.out", "w", stdout);
scanf("%d %d", &n, &c);
for ( i = 1; i <= n; i++ )
scanf("%d %d", &t[i], &p[i]);
Qsort(1, n);
Cbin(0, 1000000);
printf("%d\n", prof);
return 0;
}
void Qsort(int st, int dr)
{
int i = st-1;
int j = dr+1;
do
{
do { i++; } while ( t[i] < t[st] );
do { j--; } while ( t[st] < t[j] );
if ( i <= j )
{
int aux = t[i]; t[i] = t[j];t[j] = aux;
aux = p[i]; p[i] = p[j]; p[j] = aux;
}
} while ( i <= j );
if ( st < j ) Qsort(st, j);
if ( i < dr ) Qsort(i, dr);
}
void Cbin(int st, int dr)
{
if ( st == dr ) { Ok(st); return; }
if ( st == dr-1 )
{
Ok(st), Ok(dr);
return;
}
int mij = (st+dr)/2+1;
if ( Ok(mij) ) Cbin(mij, dr);
else Cbin(st, mij-1);
}
int Ok(int pret)
{
int s = 0, smax = 0;
if ( p[1] >= pret ) smax = s = pret - c;
for ( i = 2; i <= n; i++ )
{
int prim = p[i] >= pret ? pret : 0;
if ( s <= 0 ) s = prim-c;
else s = s + prim-c*(t[i]-t[i-1]);
if ( s > smax ) smax = s;
}
if ( smax > prof ) { prof = smax; return 1; }
else return 0;
}