Cod sursa(job #139979)

Utilizator cos_minBondane Cosmin cos_min Data 20 februarie 2008 22:48:39
Problema Carnati Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 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], A[dim];

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

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

int Solve(int);

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;
    
    int maxim = 0;
    for ( int i = 1; i <= N; i++ )
    {
        if ( maxim < Solve(P[i]) ) maxim = Solve(P[i]);
    }
    
    printf("%d\n", maxim);
}

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