Cod sursa(job #137337)

Utilizator ScrazyRobert Szasz Scrazy Data 17 februarie 2008 11:20:10
Problema Stalpi Scor 0
Compilator cpp Status done
Runda preONI 2008, Runda 4, Clasele 11-12 Marime 1.23 kb
#include <stdio.h>
#include <algorithm>
#define NM 30000
#define inf 100000*100000

using namespace std;

struct nod{ long c, s, d, x;};
long 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 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)
    {
	long j;
	min=inf;
	for (j=i-1; j>0; --j)
	    if (stalp[i].x<=stalp[j].x+stalp[j].d) 
	    {
	         if (min>a[j][1]) min=a[j][1];
	    }
	    else break;

	if (min==inf) a[i][0]=inf;
	else a[i][0]=min;
	
	min=inf;
	for (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;
	    }
	    else break;
	if (a[j][1]+stalp[i].c<min) 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;
}