Pagini recente » Cod sursa (job #1556580) | Cod sursa (job #134437) | Cod sursa (job #337468) | Betasah | Cod sursa (job #137742)
Cod sursa(job #137742)
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
int N, Cst;
#define MAXN 2048
vector<int> P;
vector< pair<int, int> > client;
int bst[2][MAXN];
//bst[i][j] = profitul maxim pentru un interval [k, i], k <= i daca costul unui carnat este j (normalizat)
int main()
{
freopen("carnati.in", "rt", stdin);
freopen("carnati.out", "wt", stdout);
scanf("%d %d", &N, &Cst);
for (int i = 0; i < N; i++)
{
int cT, cP;
scanf("%d %d", &cT, &cP);
client.push_back( make_pair( cT, cP ) );
P.push_back(cP);
}
sort( P.begin(), P.end() );
P.resize( unique( P.begin(), P.end() ) - P.begin() );
sort( client.begin(), client.end() );
int Max = -1;
for (int j = 0; j < (int)P.size(); j++)
{
if (client[0].second >= P[j])
bst[0][j] = P[j] - Cst;
else
bst[0][j] = -Cst;
if (bst[0][j] > Max)
Max = bst[0][j];
}
int step = 1;
for (int i = 1; i < N; i++, step ^= 1)
for (int j = 0; j < (int)P.size(); j++)
{
bst[step][j] = bst[1 ^ step][j] - (client[step].first - client[1 ^ step].first) * Cst;
if (client[i].second >= P[j])
bst[step][j] += P[j];
//intervalul [i, i]
int val = -Cst;
if (client[i].second >= P[j])
val += P[j];
if (val > bst[step][j])
bst[step][j] = val;
if (bst[step][j] > Max)
Max = bst[step][j];
}
printf("%d\n", Max);
return 0;
}