Cod sursa(job #1435593)

Utilizator depevladVlad Dumitru-Popescu depevlad Data 13 mai 2015 20:24:48
Problema Carnati Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.25 kb
#include <fstream>
#include <algorithm>
#include <cstring>

using namespace std;

ifstream in("carnati.in");
ofstream out("carnati.out");

const int MAX_N = 2000;
const int MAX_T = 1500;
const long long INF = 0x7fffffffffffffff;

struct Person {
    int time;
    int price;
};

Person P[MAX_N + 1];
long long V[MAX_T + 1];

long long getProfit(int def_price, int salary, int n);

int main() {
    int n, salary, i;
    long long max_sum = -INF;
    
    in >> n >> salary;
    for(i = 1; i <= n; i++)
        in >> P[i].time >> P[i].price;
        
    for(i = 1; i <= n; i++)
        max_sum = max(max_sum, getProfit(P[i].price, salary, n));
    
    out << max_sum << '\n';
    
    return 0;
}

long long getProfit(int def_price, int salary, int n) {
    int i, maxT = 0;
    memset(V, 0, sizeof(V));
    for(i = 1; i <= n; i++) {
        if(P[i].price >= def_price)
            V[P[i].time] += def_price;
        maxT = max(maxT, P[i].time);
    }
    for(i = 0; i <= maxT; i++) 
        V[i] -= salary;
    long long sum = 0, max_sum = -INF, min_sum = 0;
    for(i = 0; i <= maxT; i++) {
        min_sum = min(min_sum, sum);
        sum += V[i];
        max_sum = max(max_sum, sum - min_sum);
    }
    return max_sum;
}