Cod sursa(job #1170149)

Utilizator mihai995mihai995 mihai995 Data 12 aprilie 2014 19:20:04
Problema Carnati Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.43 kb
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;

const int N = 2001, T = 1501;

class Ssm{
    int best, sum, minSum;

public:
    Ssm(){
        best = sum = minSum = 0;
    }

    inline void insert(int x){
        sum += x;
        if (sum < minSum)
            minSum = sum;
        if (best + minSum < sum)
            best = sum - minSum;
    }

    inline int getSsm(){
        return best;
    }
};

vector<int> event[T];
int oferta[N], nrOferte, salariu;

int getProfit(int pret){
    Ssm S;
    for (int i = 0 ; i < T ; i++){
        while (!event[i].empty() && event[i].back() < pret)
            event[i].pop_back();
        S.insert( pret * event[i].size() - salariu );
    }
    return S.getSsm();
}

inline bool descrescator(const int x, const int y){
    return x > y;
}

int main(){
    int timp;
    ifstream in("carnati.in");

    in >> nrOferte >> salariu;
    for (int i = 1 ; i <= nrOferte ; i++){
        in >> timp >> oferta[i];
        event[timp].push_back( oferta[i] );
    }
    in.close();

    for (int i = 0 ; i < T ; i++)
        sort(event[i].begin(), event[i].end(), descrescator);
    sort(oferta + 1, oferta + nrOferte + 1);

    int best = 0;
    for (int i = 1 ; i <= nrOferte ; i++)
        best = max(best, getProfit(oferta[i]));

    ofstream out("carnati.out");
    out << best << '\n';
    out.close();

    return 0;
}