Cod sursa(job #1319574)

Utilizator wGEORGEWGeorge Cioti wGEORGEW Data 17 ianuarie 2015 09:59:27
Problema Aliens Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.16 kb
#include <stdio.h>
#include <math.h>
 
#define Dim 51
#define Dim3 1201
#define Dim5 1801
#define m3 600
#define m5 800
#define INF 1401
 
short 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);
    x=0;
    y=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;
}