Cod sursa(job #479983)

Utilizator crushackPopescu Silviu crushack Data 25 august 2010 22:16:13
Problema Carnati Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.5 kb
#include <stdio.h>
#define NMax 2000

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

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

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

int pd()
{
	int i,j,t,max;
	max=0;
	for (i=0;i<N;i++)
		a[1][i]= c[i].p - C,
		v[1][i]= c[i].p,
		max= (a[1][i]>max) ? a[1][i] : max;
	
	int p[2];
	p[0]=0,p[1]=1;
	t=0;
	
	for (j=2;j<=N;j++)
	{
		for (i=0;i+j-1<N;i++)
		{
			int x,y;
			
			x=a[p[1]][i+1] - abs(c[i].t-c[i+1].t)*C;  
			x+= (v[p[1]][i+1]<=c[i].p) ? v[p[1]][i+1] : 0;
			
			y=a[p[1]][i]   - abs(c[i+t+1].t-c[i].t)*C;
			y+= (v[p[1]][i]<=c[i+t+1].p) ? v[p[1]][i] : 0;
			
			if (x>y)
				a[p[0]][i]= x,
				v[p[0]][i]= v[p[1]][i+1];
			else
				a[p[0]][i]=y,
				v[p[0]][i]= v[p[1]][i];
			a[p[1]][i]=0;
			max= (a[p[0]][i]>max) ? a[p[0]][i] : max;
			
		}
		int tmp= p[0];
		p[0]=p[1];
		p[1]=tmp;
		t++;
	}
	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;
}