Cod sursa(job #168015)

Utilizator hadesgamesTache Alexandru hadesgames Data 30 martie 2008 16:51:00
Problema Wanted Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.63 kb
#include <stdio.h>
#include <stdlib.h>
struct ceva
{
	int a,b;
};
ceva a[300];
int b[300][300],c[300][300];
inline int maxc(int x,int y)
{
	if (x>y)
		return x;
	else return y;
}
inline int minc(int x,int y)
{
	if (x<y&&y==-1)
		return x;
	else
		return y;
}
int compare(const void *a,const void *b)
{
	ceva *aa=(ceva*)a;
	ceva *bb=(ceva*)b;
	if (aa->a<bb->a)
		return -1;
	if (aa->a>bb->a)
		return 1;
	return 0;
}
int main()
{
	int i,n,max,j,k,d,min;
	FILE *in,*out;
	in=fopen("wanted.in","r");
	out=fopen("wanted.out","w");
	fscanf(in,"%d",&n);
	for (i=1;i<=n;i++)
	{
		fscanf(in,"%d%d",&a[i].a,&a[i].b);
	}
	qsort(a+1,n,sizeof(a[1]),compare);
	for(i=1;i<=n;i++)
	{
		b[i][i]=a[i].b;
		c[i][i]=a[i].b;
	}
	for (d=1;d<=n;d++)
	{
		for (i=1;i<=n&&i+d<=n;i++)
		{
			j=i+d;
			b[i][j]=-1;
			c[i][j]=-1;
			for (k=i;k<=j;k++)
			{
				max=maxc(c[i][k-1]+a[k].a-a[k-1].a,b[k+1][j]+a[k+1].a-a[k].a);
				b[i][j]=minc(b[i][j],a[k].a-a[i].a+2*a[k].b+max);
				c[i][j]=minc(c[i][j],a[j].a-a[k].a+2*a[k].b+max);
			}				
		/*	b[i][i+j]=-1;
			c[i][i+j]=-1;
			for (k=0;k<=j;k++)
			{
				max=b[i+k][i+j];
				if (c[i][i+k]>max)
					max=c[i][i+k];
				if (a[i].b+a[i+k].a+a[i].a+max<b[i][i+j]||b[i][i+j]==-1)
					b[i][i+j]=a[i].b+a[i+k].a+a[i].a+max;
				if (a[i+j].b+a[i+j].a-a[i+k].a+a[i+k].b+max<c[i][i+j]||c[i][i+j]==-1)
					c[i][i+j]=a[i+j].b+a[i+j].a-a[i+k].a+a[i+k].b+max;
			}
		}*/
		}
	}
	min=-1;
	for (k=1;k<=n;k++)
		min=minc(min,a[k].a+2*a[k].b+maxc(c[1][k-1]+a[k].a-a[k-1].a,b[k+1][n]+a[k+1].a-a[k].a));
	fprintf(out,"%d\n",min);
	fclose(in);
	fclose(out);
	return 0;
}