Cod sursa(job #1841864)

Utilizator Mihai_PredaPreda Mihai Dragos Mihai_Preda Data 6 ianuarie 2017 09:58:47
Problema Carnati Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.69 kb
#include <iostream>
#include <fstream>
#include <algorithm>

using namespace std;

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

const int nMax = 2005;

struct clientStruct
{
    int timp;
    int pret;
};

int n, c;
clientStruct client[nMax];
int preturi[nMax];
int dp[nMax];
int rasp = 0;

bool cmp(clientStruct a, clientStruct b)
{
    if(a.timp < b.timp)
        return true;
    return false;
}

void citire()
{
    in >> n >> c;
    for(int i = 1; i <= n; ++i)
    {
        in >> client[i].timp >> client[i].pret;
        preturi[i] = client[i].pret;
    }
    sort(client + 1, client + n + 1, cmp);
  //  sort(preturi + 1, preturi + n + 1);
}

void TestPret(int pret)
{
    int i;
    for(i = 1; i <= n; ++i)
    {
        if(client[i].pret >= pret)
        {
            dp[i] = pret - c;
            break;
        }
        else
            dp[i] = 0;
    }
    ++i;
    int cont;
    int inc;
    while(i <= n)
    {
        if(client[i].pret >= pret)
        {
            cont = dp[i-1] + pret - c * (client[i].timp - client[i-1].timp);//daca continuam secventa
            inc = pret - c;//daca incepem subsecventa noua
            dp[i] = max(inc, cont);
        }
        else
        {
            cont = dp[i-1] - c * (client[i].timp - client[i-1].timp);
            inc = -c;
            dp[i] = max(inc, cont);
        }
        ++i;
    }
    for(int i = 1; i <= n; ++i)
    {
        rasp = max(rasp, dp[i]);
    }
}

void rezolvare()
{
    for(int i = 1; i <= n; ++i)
    {
        TestPret(preturi[i]);
    }
    out << rasp << "\n";
}

int main()
{
    citire();
    rezolvare();
    return 0;
}