Cod sursa(job #1345057)

Utilizator MihailPJack ONeill MihailP Data 17 februarie 2015 11:06:24
Problema Orase Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.87 kb
#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);
}