Pagini recente » Cod sursa (job #2295299) | Cod sursa (job #939864) | Cod sursa (job #65264) | Cod sursa (job #1701295) | Cod sursa (job #1345057)
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <limits.h>
struct city
{
int lungime, distanta;
};
int DISTANCE(struct city C1, struct city C2)
{
int D;
D = C1.lungime + C2.lungime + abs(C1.distanta - C2.distanta);
return D;
}
void MERGE(struct city A[5000], int p, int q, int r)
{
int i, j, k, n1, n2;
struct city L[5000], R[5000];
for (i = 1; i <= q - p + 1; i++)
{
L[i].lungime = A[p + i - 1].lungime;
L[i].distanta = A[p + i - 1].distanta;
}
for (i = 1; i <= r - q; i++)
{
R[i].lungime = A[q + i].lungime;
R[i].distanta = A[q + i].distanta;
}
n1 = q - p + 1;
n2 = r - q;
L[n1 + 1].distanta = INT_MAX;
R[n2 + 1].distanta = INT_MAX;
i = 1;
j = 1;
for (k = p; k <= r; k++)
{
if (L[i].distanta <= R[j].distanta)
{
A[k].distanta = L[i].distanta;
A[k].lungime = L[i].lungime;
i++;
}
else
{
A[k].distanta = R[j].distanta;
A[k].lungime = R[j].lungime;
j++;
}
}
}
void MERGE_SORT(struct city A[5000], int p, int r)
{
int q;
if (p < r)
{
q = (p + r) / 2;
MERGE_SORT(A, p, q);
MERGE_SORT(A, q + 1, r);
MERGE(A, p, q, r);
}
}
int main()
{
FILE *f, *g;
f = fopen("orase.in", "r");
g = fopen("orase.out", "w");
int n, m, i, max, D;
struct city A[50000];
fscanf(f, "%d %d", &m, &n);
for (i = 1; i <= n; i++)
{
fscanf(f, "%d %d", &A[i].distanta, &A[i].lungime);
}
MERGE_SORT(A, 1, n);
D = DISTANCE(A[1], A[2]);
if (A[1].lungime + A[2].distanta > A[2].lungime)
max = A[1].lungime + A[2].distanta;
else
max = A[2].lungime;
for (i = 3; i <= n; i++)
{
if (D < max + A[i].distanta - A[i - 1].distanta + A[i].lungime)
D = max + A[i].distanta - A[i - 1].distanta + A[i].lungime;
max = max + A[i].distanta - A[i - 1].distanta;
if (max < A[i].lungime)
{
max = A[i].lungime;
}
}
fprintf(g, "%d", D);
}