Cod sursa(job #137277)

Utilizator ScrazyRobert Szasz Scrazy Data 17 februarie 2008 10:45:44
Problema Stalpi Scor 0
Compilator cpp Status done
Runda preONI 2008, Runda 4, Clasa a 10-a Marime 1.1 kb
#include <stdio.h>
#include <algorithm>
#define NM 100002
#define inf 2000000

using namespace std;

struct nod{ int c, s, d, x;};
long a[NM][2];
nod stalp[NM];
long n;

int cmp(nod a, nod b)
{
    return a.x<b.x;
}

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

    scanf("%ld", &n);
    for (long i=1; i<=n; ++i)
	scanf("%ld %ld %ld %ld", &stalp[i].x, &stalp[i].c, &stalp[i].s, &stalp[i].d);

    long min=inf;
    sort(stalp+1,stalp+n, cmp);

    a[1][0]=0;a[1][1]=stalp[1].c;
    
    for (long i=2; i<=n; ++i)
    {
	min=inf;
	for (long j=i-1; j>0; --j)
	    if (stalp[i].x<=stalp[j].x+stalp[j].d && min>a[j][1]) min=a[j][1];
	if (min==inf) a[i][0]=inf;
	else a[i][0]=min;
	
	min=inf;
	for (long j=i-1; j>0; --j)
	    if (stalp[j].x>=stalp[i].x-stalp[i].s)
	    {
		if (min>a[j][0]+stalp[i].c) min=a[j][0]+stalp[i].c;
		if (min>a[j][1]+stalp[i].c) min=a[j][1]+stalp[i].c;
	    }
	if (min==inf) a[i][1]=a[i-1][1]+stalp[i].c;
	else a[i][1]=min; 
    }

    min=a[n][0]<a[n][1] ? a[n][0] : a[n][1];

    printf("%ld", min);

    fclose(stdin);
    fclose(stdout);

    return 0;
}