Cod sursa(job #137700)

Utilizator cos_minBondane Cosmin cos_min Data 17 februarie 2008 12:57:11
Problema Stalpi Scor 0
Compilator cpp Status done
Runda preONI 2008, Runda 4, Clasa a 10-a Marime 1.77 kb
#include <stdio.h>
#include <fstream>
using namespace std;

#define in "stalpi.in"
#define out "stalpi.out"
#define dim 10001
#define infinit (1<<21)

int N;

struct Stalp {
       int x, c, s, d;
} H[dim];

int C[dim][dim];

void Qsort(int,int);


int main()
{
    freopen(in,"r",stdin);
    freopen(out,"w",stdout);
    
    scanf("%d", &N);
    for ( int i = 1; i <= N; i++ )
        scanf("%d%d%d%d", &H[i].x, &H[i].c, &H[i].s, &H[i].d);
    
    int st, dr;
    
    for ( int i = 1; i <= N; i++ )
        for ( int j = 1; j <= N; j++ )
            C[i][j] = infinit;
    
    Qsort(1,N);
    
    for ( int i = 1; i <= N; i++ )
    {
        int A = dim, B = 0;
        st = H[i].x - H[i].s, dr = H[i].x + H[i].d;
        
        for ( int j = 1; j <= N; j++ )
            if ( st <= H[j].x && H[j].x <= dr ) 
            {
               if ( A > j ) A = j;
               if ( B < j ) B = j;
            }
        
        if ( C[A][B] > H[i].c ) C[A][B] = H[i].c;
    }
    
    for ( int i = 1; i <= N; i++ )
        for ( int j = 1; j <= i; j++ )
            for ( int x1 = 1; x1 < N; x1++ )
                for ( int x2 = x1; x2 <= N; x2++ )
                    if ( C[x1][x2] > C[x1][i] + C[j][x2] ) C[x1][x2] = C[x1][i] + C[j][x2];
    
    printf("%d", C[1][N]);
        
}

void Qsort(int st, int dr)
{
     int i = st-1, j = dr+1;
     Stalp pivot = H[st];
     
     while ( i <= j )
     {
           do { i++; } while ( H[i].x < pivot.x );
           do { j--; } while ( H[j].x > pivot.x );
           
           if ( i < j )
           {
                Stalp aux;
                aux = H[i], H[i] = H[j], H[j] = aux;
           }
     }
     
     if ( st < j ) Qsort(st,j);
     if ( i < dr ) Qsort(i,dr);
}