Pagini recente » Cod sursa (job #403751) | Cod sursa (job #1290120) | Cod sursa (job #1637221) | Cod sursa (job #1187874) | Cod sursa (job #993452)
Cod sursa(job #993452)
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <set>
#include <queue>
#include <deque>
using namespace std;
ifstream f("stalpi.in");
ofstream g("stalpi.out");
#define ll long long
#define pb push_back
#define mp make_pair
#define sz size
#define X first.first
#define C first.second
#define St second.first
#define Dr second.second
#define nmax 100005
#define inf (1<<29)
int n, dp[nmax];
pair< pair<int,int>, pair<int,int> > v[nmax];
void citeste(){
f >> n;
for(int i=1; i<=n; ++i){
int x, y, z, t;
f >> x >> y >> z >> t;
v[i] = mp( mp(x, y), mp(z, t) );
}
}
void rezolva(){
sort(v+1, v+n+1);
int Rez = inf;
dp[1] = v[1].C;
if (v[1].X + v[1].Dr >= v[n].X){
//cout << dp[1] << "\n";
Rez = min(Rez, dp[1]);
}
for(int i=2; i<=n; ++i){
int j = i-1;
dp[i] = inf;
for(; j>=0; --j){
if ( v[i].X - v[i].St > v[j].X ) break;// nu il poate acoperi
dp[i] = min(dp[i], dp[j] + v[i].C);
}
int First = j; // asta pe primul pe care nu il poate acoperi i
for(; j>=1; --j){
if ( v[j].X + v[j].Dr >= v[First].X ){// il poate acoperi
dp[i] = min(dp[i], dp[j] + v[i].C);
}
}
if (v[i].X + v[i].Dr >= v[n].X){
// cout << dp[i] << " " << i << "\n";
Rez = min(Rez, dp[i]);
}
}
g << Rez << "\n";
}
int main(){
citeste();
rezolva();
f.close();
g.close();
return 0;
}