Pagini recente » Cod sursa (job #1051481) | Cod sursa (job #2622865) | Cod sursa (job #258289) | Cod sursa (job #2735024) | Cod sursa (job #788413)
Cod sursa(job #788413)
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
ifstream f("carnati.in");
ofstream g("carnati.out");
#define nmax 2005
#define inf (1<<30)
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 - C);
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 << Profit << "\n";
}
int main(){
citeste();
rezolva();
f.close();
g.close();
return 0;
}