Cod sursa(job #123392)

Utilizator perticas_catalinperticas catalin perticas_catalin Data 15 ianuarie 2008 18:57:08
Problema Aliens Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.33 kb
//aliens
#include<stdio.h>
#include<math.h>
#define max(a,b)((a)>(b)?(a):(b))
#define min(a,b)((a)<(b)?(a):(b))
#define inf 0x3f3f
FILE*fin=fopen("aliens.in","r");
FILE*fout=fopen("aliens.out","w");
short e2[51],e3[51],e5[51],min3[51],min5[51],max3[51],max5[51];
short smin3=0,smax3=0,smin5=0,smax5=0,d[2][2001][2001];
short dr;char rez[5000];
void prod(char a)
{
	short t=0,i;
	for(i=0;i<dr;i++)
	{
	rez[i]=rez[i]*a+t;
	t=rez[i]/10;
	rez[i]%=10;
	}
	if(t) rez[dr++]=t;
}
short dc(short ind)
{
return ind+1000;
}
int main()
{
  int n,o=0,nw=1,i,aux;
  long nr;
  short b2,b3,b5,x2,x3,x5;
  double ln2,ln3,ln5,best;
  ln2=log(2.0);
  ln3=log(3.0);
  ln5=log(5.0);best=0;
  fscanf(fin,"%d",&n);
  min3[0]=0;min5[0]=0;max3[0]=0;max5[0]=0;
  for(i=1;i<=n;i++)
  {
    e2[i]=0;e3[i]=0;e5[i]=0;
    fscanf(fin,"%ld",&nr);
    while(nr>1&&nr%2==0){e2[i]++;nr/=2;}
    while(nr>1&&nr%3==0){e3[i]++;nr/=3;}
    while(nr>1&&nr%5==0){e5[i]++;nr/=5;}
    fscanf(fin,"%ld",&nr);
    while(nr>1&&nr%2==0){e2[i]--;nr/=2;}
    while(nr>1&&nr%3==0){e3[i]--;nr/=3;}
    while(nr>1&&nr%5==0){e5[i]--;nr/=5;}
    smin3=min(smin3,smin3+e3[i]);smax3=max(smax3,smax3+e3[i]);
    smin5=min(smin5,smin5+e5[i]);smax5=max(smax5,smax5+e5[i]);
    min3[i]=smin3;max3[i]=smax3;min5[i]=smin5;max5[i]=smax5;
  }
  d[o][dc(0)][dc(0)]=0;
  for(i=1;i<=n;i++,aux=o,o=nw,nw=aux)
    for(x3=min3[i];x3<=max3[i];x3++)
      for(x5=min5[i];x5<=max5[i];x5++)
      {
      d[nw][dc(x3)][dc(x5)]=-inf;
      if(min3[i-1]<=x3&&max3[i-1]>=x3&&min5[i-1]<=x5&&max5[i-1]>=x5)
	d[nw][dc(x3)][dc(x5)]=max(d[nw][dc(x3)][dc(x5)],d[o][dc(x3)][dc(x5)]);
      if(min3[i-1]<=(x3-e3[i])&&max3[i-1]>=(x3-e3[i])&&min5[i-1]<=(x5-e5[i])&&max5[i-1]>=(x5-e5[i])&&d[o][dc(x3)-e3[i]][dc(x5)-e5[i]]!=-inf)
	d[nw][dc(x3)][dc(x5)]=max(d[nw][dc(x3)][dc(x5)],d[o][dc(x3)-e3[i]][dc(x5)-e5[i]]+e2[i]);
      }
  for(x3=0;x3<=max3[n];x3++)
    for(x5=0;x5<=max5[n];x5++)
      {
	x2=d[o][dc(x3)][dc(x5)];
	if(x2>=0&&(x2*ln2+x3*ln3+x5*ln5)>best)
	  {
	    best=x2*ln2+x3*ln3+x5*ln5;
	    b2=x2;b3=x3;b5=x5;
	  }
			}
	dr=1;rez[0]=1;
	//fprintf(fout,"%d" "%c" "%d" "%c" "%d",b2,' ',b3,' ',b5);
	for(i=1;i<=b2;i++)
		prod(2);
	for(i=1;i<=b3;i++)
		prod(3);
	for(i=1;i<=b5;i++)
		prod(5);
	for(i=dr-1;i>=0;i--)
		fprintf(fout,"%d",rez[i]);
	fclose(fin);fclose(fout);
return 0;
}