Pagini recente » Cod sursa (job #3182134) | Istoria paginii runda/49maimare48 | Cod sursa (job #2304087) | Cod sursa (job #24468) | Cod sursa (job #273521)
Cod sursa(job #273521)
#include <iostream>
#define NMAX 2005
using namespace std;
struct carnat{
int t, p;
};
carnat a[NMAX], b[NMAX];
FILE *f = fopen("carnati.in", "r"), *g = fopen("carnati.out", "w");
int N, C, vector[NMAX];
int add(int x, int y, int k)
{
a[k].p = x;
a[k].t = y;
while (a[k].p < a[(k - 1) / 2].p)
{
int aux = a[k].p;
a[k].p = a[(k - 1) / 2].p;
a[(k - 1) / 2].p = aux;
aux = a[k].t;
a[k].t = a[(k - 1) / 2].t;
a[(k - 1) / 2].t = aux;
k = (k - 1) / 2;
}
return 0;
}
int del(int k)
{
b[k].p = a[0].p;
b[k].t = a[0].t;
a[0].p = a[N - k - 1].p;
a[0].t = a[N - k - 1].t;
int i = 0;
while ((2 * i + 2 <= N - k - 2) && ((a[i].p > a[2 * i + 1].p) || (a[i].p > a[2 * i + 2].p)))
{
if ((a[i].p > a[2 * i + 1].p) && (a[i].p > a[2 * i + 2].p))
{
if (a[2 * i + 1].p > a[2 * i + 2].p)
{
int aux = a[2 * i + 2].p;
a[2 * i + 2].p = a[i].p;
a[i].p = aux;
aux = a[2 * i + 2].t;
a[2 * i + 2].t = a[i].t;
a[i].t = aux;
i = 2 * i + 2;
}
else
{
int aux = a[2 * i + 1].p;
a[2 * i + 1].p = a[i].p;
a[i].p = aux;
aux = a[2 * i + 1].t;
a[2 * i + 1].t = a[i].t;
a[i].t = aux;
i = 2 * i + 1;
}
}
else
{
if (a[i].p > a[2 * i + 1].p)
{
int aux = a[2 * i + 1].p;
a[2 * i + 1].p = a[i].p;
a[i].p = aux;
aux = a[2 * i + 1].t;
a[2 * i + 1].t = a[i].t;
a[i].t = aux;
i = 2 * i + 1;
}
else
{
int aux = a[2 * i + 2].p;
a[2 * i + 2].p = a[i].p;
a[i].p = aux;
aux = a[2 * i + 2].t;
a[2 * i + 2].t = a[i].t;
a[i].t = aux;
i = 2 * i + 2;
}
}
}
if ((2 * i + 1 <= N - k - 2) && (a[i].p > a[2 * i + 1].p))
{
int aux = a[2 * i + 1].p;
a[2 * i + 1].p = a[i].p;
a[i].p = aux;
aux = a[2 * i + 1].t;
a[2 * i + 1].t = a[i].t;
a[i].t = aux;
i = 2 * i + 1;
}
return 0;
}
int maxim(int a, int b)
{
if (a < b)
return b;
return a;
}
int main()
{
fscanf(f, "%d %d", &N, &C);
for (int i = 0; i < N; ++i)
{
int x, y;
fscanf(f, "%d %d", &x, &y);
add(x, y, i);
}
fclose(f);
for (int i = 0; i < N; ++i)
{
del(i);
}
int max = 0;
for (int i = 0; i < N; ++i)
{
//pretul stabilit este b[i].t
int pret = b[i].t;
if (pret <= b[0].t)
{
vector[0] = maxim(pret - C, 0);
}
else
{
vector[0] = 0;
}
for (int j = 1; j < N; ++j)
{
if (pret <= b[j].t)
{
vector[j] = maxim(pret - C, vector[j - 1] - ((b[j].p - b[j - 1].p) * C) + pret);
}
else
{
//vector[j] = maxim(0, vector[j - 1] - (b[j].p - b[j - 1].p) * C);
vector[j] = 0;
}
}
for (int j = 0; j < N; ++j)
{
if (vector[j] > max)
{
max = vector[j];
}
}
}
fprintf(g, "%d", max);
fclose(g);
return 0;
}