Pagini recente » Cod sursa (job #1546780) | Cod sursa (job #1775783) | Cod sursa (job #1258385) | Cod sursa (job #2117583) | Cod sursa (job #1456479)
#include <cstdio>
#include <cstring>
#include <climits>
#include <algorithm>
using namespace std;
#define Nmax 2002
#define inf INT_MAX
FILE *f = fopen ( "carnati.in", "r" );
FILE *g = fopen ( "carnati.out", "w" );
struct client{
int timp, bani, chelt;
}v[Nmax];
bool cmp ( client A, client B ){
return A.timp < B.timp;
}
// D[i] = castigul maxim pe care il pot obtine cu primii i clienti
int D[Nmax];
int main(){
int N, K, sol = -inf;
fscanf ( f, "%d%d", &N, &K );
for ( int i = 1; i <= N; ++i )
fscanf ( f, "%d%d", &v[i].timp, &v[i].bani );
sort ( v + 1, v + N + 1, cmp );
v[0].timp = v[1].timp-1;
//calc cat pierd daca mai stau si dupa clientul i
for ( int i = 1; i <= N; ++i )
v[i].chelt = (v[i].timp - v[i-1].timp) * K;
for ( int i = 1; i <= N; ++i ){
memset ( D, 0, sizeof(D) );
int price = v[i].bani, maxx = -inf;
for ( int j = 1; j <= N; ++j ){
if ( v[j].bani >= price )// daca cel curent poate platii
//maxim dintre a incepe de la i si dintre a-l adauga si pe i
D[j] = max ( price - K, D[j-1] + price - v[j].chelt );
else // altfel
// maxim dintre a incepe de la i si dintre a-l adauga si pe i
D[j] = max ( -K, D[j-1] - v[j].chelt );
//actualizez maximul local
maxx = max ( maxx, D[j] );
}
//actualizez maximul global
sol = max ( sol, maxx );
}
fprintf ( g, "%d", sol );
return 0;
}