Cod sursa(job #139261)

Utilizator cos_minBondane Cosmin cos_min Data 19 februarie 2008 21:19:36
Problema Carnati Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.42 kb
#include <stdio.h>
#include <fstream>
#include <set>
#include <utility>
using namespace std;

#define in "carnati.in"
#define out "carnati.out"
#define dim 2001

int N, C;
int P[dim], T[dim];
long long A[dim];

set< pair<int,int> > G;
set< pair<int,int> >::iterator it;

int Solve(int);

inline int Maxim(int a, int b) {
       if ( a > b ) return a;
       return b;
}

int main()
{
    int X, Y;
    freopen(in,"r",stdin);
    freopen(out,"w",stdout);
    
    scanf("%d%d", &N, &C);
    for ( int i = 1; i <= N; i++ )
        scanf("%d%d", &X, &Y), G.insert( make_pair(X,Y) );
    
    int k = 0;
    for ( it = G.begin(); it != G.end(); it++ )
        k++, T[k] = it->first, P[k] = it->second;
    
    long long maxim = 0;
    for ( int i = 1; i <= N; i++ )
    {
        if ( maxim < Solve(P[i]) ) maxim = Solve(P[i]);
    }
    
    printf("%lld\n", maxim);
}

int Solve(int M)
{
    int K = 0, timp;
    memset(A,0,sizeof(A));
    
    if ( P[1] >= M ) A[1] = M-C;
    else             A[1] = 0;
    
    for ( int i = 2; i <= N; i++ )
    { 
        A[i] = 0;
        if ( P[i] >= M ) 
        {
             A[i] = M-C;
             if ( A[i] < A[i-1] - (T[i]-T[i-1])*C + M ) A[i] = A[i-1] - (T[i]-T[i-1])*C + M;
        }
        else if ( A[i] < A[i-1] - (T[i]-T[i-1])*C ) A[i] = A[i-1] - (T[i]-T[i-1])*C;
       
        if ( K < A[i]-C ) K = A[i];
    }

    return K;
}