Cod sursa(job #137377)

Utilizator ada_sAda-Mihaela Solcan ada_s Data 17 februarie 2008 11:49:12
Problema Carnati Scor 60
Compilator cpp Status done
Runda preONI 2008, Runda 4, Clasa a 10-a Marime 1.43 kb
#include <fstream>
std::ifstream f1("carnati.in");
std::ofstream f2("carnati.out");
struct elem
{
	int t;
	long p;
};//struct elem

int part(struct elem sir[2010], int jos, int sus);
void qsort(struct elem sir[2010], int jos, int sus);

struct elem om[2010];
int main()
{
	long long max=0, temp, prec;
	int n, i, j, cump;
	long c, pmin, pminprec;
	f1>>n>>c;
	for (i=0; i<n; i++)
		f1>>om[i].t>>om[i].p;
	qsort(om, 0, n-1);
	for (i=0; i<n; i++)
	{
		pmin=om[i].p;
		temp=om[i].p-c;
		if (temp>max)
			max=temp;
		prec=temp;
		pminprec=pmin;
		cump=1;
		for (j=i+1; j<n; j++)
		{
			prec-=c*(om[j].t-om[j-1].t);
			if (om[j].p<pmin)
				pmin=om[j].p;
			temp=pmin*(cump+1)-((om[j].t-om[i].t+1)*c);
			if (temp>max)
				max=temp;
			if (prec>max)
				max=prec;
			if (temp>prec)
			{
  			prec=temp;
				pminprec=pmin;
				cump++;
			}//if
			else
				pmin=pminprec;
		}//for j
	}//for i
	f2<<max;
	f1.close();
	f2.close();
	return 0;
}//main

int part(struct elem sir[2010], int jos, int sus)
{
  int p=jos, q=sus;
	struct elem temp;
	while (p<q)
	{
		while ((p<=q)&&(sir[p].t<=sir[jos].t))
		  p++;
		while ((p<=q)&&(sir[q].t>sir[jos].t))
		  q--;
    if (p<q)
		{
			temp=sir[p];
			sir[p]=sir[q];
			sir[q]=temp;
		}//if
	}//while	
	temp=sir[q];
	sir[q]=sir[jos];
	sir[jos]=temp;
	return q;
}//part

void qsort(struct elem sir[2010], int jos, int sus)
{
	int p;
	if (jos<sus)
	{
		p=part(sir, jos, sus);
		qsort(sir, jos, p-1);
		qsort(sir, p+1, sus);
	}//if
}//qsort