Cod sursa(job #137485)

Utilizator Adriana_SAdriana Sperlea Adriana_S Data 17 februarie 2008 12:25:45
Problema Stalpi Scor 20
Compilator cpp Status done
Runda preONI 2008, Runda 4, Clasa a 10-a Marime 1.13 kb
#include <stdio.h>
#include <algorithm>

using namespace std;

const int N_MAX = 100010;
const int INF = 2000000000;

int a[N_MAX][2];

struct stalp {
	int X, C, S, D;
} v[N_MAX];

int cmp(stalp a, stalp b)
{
	return (a.X < b.X);
}

inline int MIN(int a, int b)
{
	return (a < b ? a : b);
}

int main()
{
	freopen("stalpi.in", "r", stdin);
#ifndef _SCREEN_
	freopen("stalpi.out", "w", stdout);
#endif

	int N, i;
	scanf("%d\n", &N);
	for (i = 1; i <= N; i ++) {
		scanf("%d %d %d %d\n", &v[i].X, &v[i].C, &v[i].S, &v[i].D);
		a[i][0] = a[i][1] = INF;
	}

	sort(v + 1, v + N + 1, cmp);

	a[1][1] = v[1].C;

	int j;
	for (i = 2; i <= N; i ++) {
		for (j = i - 1; j >= 1; j --) {
			if (v[j].X + v[j].D >= v[i].X && a[j][1] <= a[i][0]) a[i][0] = a[j][1];
		}

		if (v[i].X - v[i].S <= 0) a[i][1] = v[i].C;
//		a[i][1] = MIN(a[i][1], (MIN(a[i - 1][1], a[i - 1][0]) + v[i].C));
		for (j = i - 1; j >= 1; j --) {
			if (v[j].X < v[i].X - v[i].S) {
				a[i][1] = MIN(a[i][1], MIN(a[j][0], a[j][1]) + v[i].C);
				break;
			} else {
				a[i][1] = MIN(a[i][1], MIN(a[j][0], a[j][1]) + v[i].C);
			}
		}

	}

	printf("%d\n", MIN(a[N][1], a[N][0]));

	return 0;
}