Cod sursa(job #374932)

Utilizator loginLogin Iustin Anca login Data 18 decembrie 2009 19:52:03
Problema Carnati Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.32 kb
# include <fstream>
using namespace std;
int n, k, t[2003], p[2003], pmax=-(1<<30);
ofstream fout ("carnati.out");

int profit (int pr)
{
	int c[2003], i, pozp=1, pozc=0;
	for(i=t[1];pozp<=n;i++)
		if (i==t[pozp])
		{
			if (p[pozp]>=p[pr])
				c[++pozc]=p[pr]-k;
			else
				c[++pozc]=-k;
			pozp++;
			while (t[pozp-1]==t[pozp])
			{	
				if (p[pozp]>=p[pr])
					c[pozc]+=p[pr];
				pozp++;
			}
		}
		else		
			if (c[pozc]<=-k)
				c[pozc]-=k;
			else
				c[++pozc]=-k;
			
	int smin, scur, s;
	smin=c[t[1]];
	s=c[t[1]];
	scur=c[t[1]];
	for (i=t[1]+1;i<=pozc;i++)
	{
		scur+=c[i];
		if (scur-smin>s)
			s=scur-smin;
		if (smin>scur)
			scur=smin;
	}

	return s;
}

void read ()
{
	ifstream fin ("carnati.in");
	fin>>n>>k;
	for (int i=1;i<=n;i++)
		fin>>t[i]>>p[i];
}

void qsort (int st, int dr)
{
	if (st<dr)
	{
		int i=st, j=dr, d=0, m=(st+dr)/2, a;
		a=t[i], t[i]=t[m], t[m]=a;
		a=p[i], p[i]=p[m], p[m]=a;
		while (i<j)
		{
			if (t[i]>t[j])
			{
				a=t[i], t[i]=t[j], t[j]=a;
				a=p[i], p[i]=p[j], p[j]=a;
				d=1-d;
			}
			i+=d;
			j-=1-d;
		}
		qsort (st, i-1);
		qsort (i+1, dr);
	}
}

int main ()
{
	int pcur;
	read ();
	qsort (1, n);
	for (int i=1;i<=n;i++)
	{	
		pcur=profit(i);
		if (pcur>pmax)
			pmax=pcur;
	}
	fout<<pmax;
	return 0;
}