Pagini recente » Cod sursa (job #2468912) | Cod sursa (job #2030389) | Cod sursa (job #310918) | Electron_A | Cod sursa (job #137285)
Cod sursa(job #137285)
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
#define DBxG
#define fin "stalpi.in"
#define fout "stalpi.out"
#define pb push_back
#define sz(c) (int)((c).size())
#define mp make_pair
#define f first
#define s second
const int Nmax = 100010;
const int Max = 1000000000;
int N;
vector < pair < pair < int , int > , pair < int , int > > > v;
int dp[Nmax][2];
void readdata()
{
int i,x,c,s,d;
freopen(fin,"r",stdin);
freopen(fout,"w",stdout);
scanf("%d",&N);
for ( i = 1; i <= N; ++i )
{
scanf("%d%d%d%d",&x,&c,&s,&d);
v.pb( mp( mp(x,c) , mp(x-s,x+d) ) );
}
#ifdef DBG
printf("%d\n",(sizeof(int)*100000*4 + sizeof(dp))/1024);
#endif
}
void solve()
{
int i,j;
sort(v.begin(),v.end());
#ifdef DBG
for ( i = 0; i < N; ++i )
printf("%d %d %d %d\n",v[i].f.f,v[i].f.s,v[i].s.f,v[i].s.s);
#endif
for ( i = 1; i <= N; ++i )
{
dp[i][0] = Max;
for ( j = 1; j < i; ++j )
if ( v[j-1].s.s >= v[i-1].f.f && dp[i][0] > dp[j][1] )
dp[i][0] = dp[j][1];
dp[i][1] = Max;
for ( j = i-1; j > 0 && v[i-1].s.f <= v[j-1].f.f; --j )
{
if ( dp[j][0] < dp[i][1] )
dp[i][1] = dp[j][0];
if ( dp[j][1] < dp[i][1] )
dp[i][1] = dp[j][1];
}
if ( dp[j][0] < dp[i][1] )
dp[i][1] = dp[j][0];
if ( dp[j][1] < dp[i][1] )
dp[i][1] = dp[j][1];
dp[i][1] = dp[i][1] + v[i-1].f.s;
}
printf("%d\n",min(dp[N][0],dp[N][1]));
}
int main()
{
readdata();
solve();
return 0;
}