Cod sursa(job #138229)

Utilizator tm_raduToma Radu tm_radu Data 17 februarie 2008 23:45:19
Problema Carnati Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.6 kb
#include <stdio.h>

int n, c;
int t[2001], p[2001];
int i, j, k;
long long int prof = 0;

void Cbin(int st, int dr);
void Qsort(int st, int dt);
int Ok(int pret);
int Max(long long int i, long long int j) { return i > j ? i : j; }

int main()
{
    freopen("carnati.in", "r", stdin);
    freopen("carnati.out", "w", stdout);
    scanf("%d %d", &n, &c);
    for ( i = 1; i <= n; i++ )
        scanf("%d %d", &t[i], &p[i]);
    Qsort(1, n);
    Cbin(0, 1000000);
    printf("%d\n", prof);
    
    return 0; 
}

void Qsort(int st, int dr)
{
    int i = st-1;
    int j = dr+1;
    do
    {
        do { i++; } while ( t[i] < t[st] );
        do { j--; } while ( t[st] < t[j] );
        if ( i <= j )
        {
            int aux = t[i]; t[i] = t[j];t[j] = aux;    
            aux = p[i]; p[i] = p[j]; p[j] = aux;
        }
    } while ( i <= j );            
    if ( st < j ) Qsort(st, j);
    if ( i < dr ) Qsort(i, dr);
}

void Cbin(int st, int dr)
{
    if ( st == dr ) { Ok(st); return; }
    if ( st == dr-1 )
    {
        Ok(st), Ok(dr);
        return;
    }    
    int mij = (st+dr)/2+1;
    if ( Ok(mij) ) Cbin(mij, dr);
    else Cbin(st, mij-1);
}

int Ok(int pret)
{
    long long int s = 0, smax = 0;
    if ( p[1] >= pret ) smax = s = pret - c;
    for ( i = 2; i <= n; i++ )
    {
        int prim = p[i] >= pret ? pret : 0;
        if ( s <= 0 ) s = prim-c;
        else          s = s + prim-c*(t[i]-t[i-1]);
        if ( s > smax ) smax = s;
    }
    if ( smax > prof ) { prof = smax; return 1; }
    else return 0;
}