Cod sursa(job #993452)

Utilizator vendettaSalajan Razvan vendetta Data 3 septembrie 2013 21:20:32
Problema Stalpi Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.57 kb
#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;
}