Cod sursa(job #788410)

Utilizator vendettaSalajan Razvan vendetta Data 14 septembrie 2012 20:12:54
Problema Carnati Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.83 kb
#include <iostream>
#include <fstream>
#include <algorithm>

using namespace std;

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

#define nmax 2005
#define inf (1<<29)

int n, C;
pair<int,int> v[nmax];

void citeste(){

	f >> n >> C;//numarul de persoane; si Costul cu care e platit vanzatorul
    for(int i=1; i<=n; ++i){
        int x, y;
        f >> x >> y;
        v[i] = make_pair( x,y );
    }

    sort(v+1, v+n+1);

}

void rezolva(){

    // nu e Gata

    //trebuie sa aleg un interval in care magazinul sa fie deschis a. i. profitul sa fie maxim;
    //adica am odata un cost = C * cat_timp_e_deschit; si un Venit = Pret*cati oameni din intervalul ales o sa cumpere carnatul cu pretul Pret
    //un om poate cumpara un carnat daca v[i].second >=Pret;

    //pentru i fac profitul maxim a. i. pretul unui carnat e v[i].second;
    //aleg maximul

    int rez = 0;

    int Profit = -inf;

    for(int i=1; i<=n; ++i){
        //presupun ca pretul e v[i].second;
        // ma duc in stanga si aleg profitul maxim
        int timp_i = v[i].first;
        int pret_i = v[i].second;
        int cat = 0;//imi zice cate preturi sunt >= cu pret_i;
        //Profit = max(Profit, pret_i - timp_i);
        for(int j=i-1; j>=1; --j){
            if (v[j].second >= pret_i) ++cat;
            int cat2 = 0;
            for(int k=i; k<=n; ++k){
                if (v[k].second >= pret_i) ++cat2;
                int Cost = (v[k].first - v[j].first+1) * C;//il tin deschis de la j la k
                if (Profit < (pret_i * (cat+cat2)  - Cost) ){
                    Profit = (pret_i * (cat+cat2)  - Cost);
                }
            }
        }
    }

    //cout << Profit << "\n";

    g << max(0,Profit) << "\n";

}

int main(){

    citeste();
    rezolva();

    f.close();
    g.close();

    return 0;

}