Cod sursa(job #567282)

Utilizator rootsroots1 roots Data 29 martie 2011 22:00:35
Problema Aliens Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.64 kb
#include <stdio.h>
#include <string.h>
#include <math.h>

#define Dim 51
#define Dim3 1201
#define Dim5 1801
#define m3 600
#define m5 800
#define INF 1401

int D[Dim3][Dim5];

struct vector
{
	int i2,i3,i5;
}pw[Dim];

inline int fmax(int a,int b)
{
	if(a>b) return a;
	else return b;
}

int main()
{
	int i,j,N,x,y,ind;
	unsigned long long w;
	double log2,log3,log5,E,sol;

	freopen("aliens.in","r",stdin);

	scanf("%d",&N);
	for(i=1;i<=N;i++)
	{
		scanf("%d",&x);
		while(x%2==0)
		{
			pw[i].i2++;
			x/=2;
		}
		while(x%3==0)
		{
			pw[i].i3++;
			x/=2;
		}
		while(x%5==0)
		{
			pw[i].i5++;
			x/=2;
		}

		scanf("%d",&x);
		while(x%2==0)
		{
			pw[i].i2--;
			x/=2;
		}
		while(x%3==0)
		{
			pw[i].i3--;
			x/=2;
		}
		while(x%5==0)
		{
			pw[i].i5--;
			x/=2;
		}
	}

	for(i=0;i<Dim3;i++)
		for(j=0;j<Dim5;j++)
			D[i][j]=INF;

	D[pw[1].i3+m3][pw[1].i5+m5]=pw[1].i2;

	for(ind=2;ind<=N;ind++)
	{
		for(i=Dim3-1;i>=0;i--)
			for(j=Dim5-1;j>=0;j--)
				if(D[i][j]!=INF)
					if(D[i-pw[ind].i3][j-pw[ind].i5]!=INF) D[i][j]=fmax(D[i][j],D[i-pw[ind].i3][j-pw[ind].i5]+pw[ind].i2);
					else D[i][j]=fmax(D[i][j],pw[ind].i2);
		D[pw[ind].i3+m3][pw[ind].i5+m5]=pw[ind].i2;
	}

	sol=-1;
	log2=log(2.0);
	log3=log(3.0);
	log5=log(5.0);

	for(i=0;i<Dim3;i++)
		for(j=0;j<Dim5;j++)
			if(D[i][j]!=INF)
			{
				E=D[i][j]*log2+i*log3+j*log5;
				if(E>sol)
				{
					sol=E;
					x=i;
					y=j;
				}
			}

	freopen("aliens.out","w",stdout);

	w=1;
	for(i=1;i<=D[x][y];i++) w*=2;
	for(i=1;i<=x-m3;i++) w*=3;
	for(i=1;i<=y-m5;i++) w*=5;

	printf("%lld\n",w);

	return 0;
}