Cod sursa(job #479977)

Utilizator crushackPopescu Silviu crushack Data 25 august 2010 21:33:12
Problema Carnati Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 kb
#include <stdio.h>
#define NMax 2000

const char IN[]   ="carnati.in";
const char OUT[]  ="carnati.out";

int N,C;
int a[NMax][NMax];
short v[NMax][NMax];
struct client
{int t,p;
} c[NMax];

int abs(int x)
{
	return (x<0) ? -x : x;
}

int pd()
{
	int i,j,max;
	
	for (i=0;i<N;i++)
		a[i][i]= c[i].p - C,
		v[i][i]= i,
		max= (a[i][i]>max) ? a[i][i] : max;
	
	for (j=2;j<=N;j++)
	{
		for (i=0;i+j-1<N;i++)
		{
			int x,y;
			x=i;
			y=i+j-1;
			
			int p1,p2;
			
			p1=a[x+1][y] - abs(c[x+1].t-c[x].t)*C; p1+= (c[v[x+1][y]].p<=c[x].p) ? c[v[x+1][y]].p : 0;
			p2=a[x][y-1] - abs(c[y-1].t-c[y].t)*C; p2+= (c[v[x][y-1]].p<=c[y].p) ? c[v[x][y-1]].p : 0;
			
			//a[x][y]= (p1>p2) ? p1 : p2;
			if (p1>p2)
				a[x][y]= p1,
				v[x][y]=v[x+1][y];
			else
				a[x][y]=p2,
				v[x][y]=v[x][y-1];
			max= (a[x][y]>max) ? a[x][y] : max;
			
		}
	}
	return max;
}

void citire()
{
	int i;
	freopen(IN,"r",stdin);
	scanf("%d%d",&N,&C);
	for (i=0;i<N;i++)
		scanf("%d%d",&c[i].t,&c[i].p);
	fclose(stdin);
}

void scriere(int x)
{
	freopen(OUT,"w",stdout);
	printf("%d\n",x);
	fclose(stdout);
}

void sort(client a[])
{
	int i,j;
	for (i=0;i<N;i++)
	{
		int p=i;
		for (j=i+1;j<N;j++)
			if ( a[j].t<a[p].t || (a[j].t==a[p].t && a[j].p<a[p].p))
				p=j;
		if (i!=p)
		{
			client tmp= a[i];
			a[i]=a[p];
			a[p]=tmp;
		}
	}
}

int main()
{
	citire();
	sort(c);
	scriere(pd());
	return 0;
}