Pagini recente » Cod sursa (job #1263954) | Cod sursa (job #1162005) | Cod sursa (job #2166391) | Cod sursa (job #615334) | Cod sursa (job #137336)
Cod sursa(job #137336)
#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;
}