Cod sursa(job #1456479)

Utilizator BLz0rDospra Cristian BLz0r Data 30 iunie 2015 22:35:47
Problema Carnati Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.56 kb
#include <cstdio>
#include <cstring>
#include <climits>
#include <algorithm>
using namespace std;

#define Nmax 2002
#define inf INT_MAX

FILE *f = fopen ( "carnati.in", "r" );
FILE *g = fopen ( "carnati.out", "w" );

struct client{
    int timp, bani, chelt;
}v[Nmax];

bool cmp ( client A, client B ){
    return A.timp < B.timp;
}

// D[i] = castigul maxim pe care il pot obtine cu primii i clienti
int D[Nmax];

int main(){

    int N, K, sol = -inf;

    fscanf ( f, "%d%d", &N, &K );
    for ( int i = 1; i <= N; ++i )
        fscanf ( f, "%d%d", &v[i].timp, &v[i].bani );

    sort ( v + 1, v + N + 1, cmp );

    v[0].timp = v[1].timp-1;

    //calc cat pierd daca mai stau si dupa clientul i
    for ( int i = 1; i <= N; ++i )
        v[i].chelt = (v[i].timp - v[i-1].timp) * K;

    for ( int i = 1; i <= N; ++i ){

        memset ( D, 0, sizeof(D) );
        int price = v[i].bani, maxx = -inf;

        for ( int j = 1; j <= N; ++j ){

            if ( v[j].bani >= price )// daca cel curent poate platii
            //maxim dintre a incepe de la i si dintre a-l adauga si pe i
                D[j] = max ( price - K, D[j-1] + price - v[j].chelt );
            else // altfel
            // maxim dintre a incepe de la i si dintre a-l adauga si pe i
                D[j] = max ( -K, D[j-1] - v[j].chelt );

            //actualizez maximul local
            maxx = max ( maxx, D[j] );
        }

        //actualizez maximul global
        sol = max ( sol, maxx );
    }

    fprintf ( g, "%d", sol );

    return 0;
}