Cod sursa(job #2736908)

Utilizator vansJos da pa perete vans Data 4 aprilie 2021 10:24:04
Problema Aliens Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.14 kb
#include <bits/stdc++.h>

#define inf 30000
using namespace std;

ifstream fin("aliens.in");
ofstream fout("aliens.out");

const int nr3 = 18 * 18, nr5 = 12 * 12;
short int dp[2 * nr5 + 40][2 * nr3 + 40], afis[10000], st5, dr5, st3, dr3;

void inmult(int val){
    int t = 0;
    for(int i = 1; i <= afis[0]; ++i){
        afis[i] = afis[i] * val + t;
        t = afis[i] / 10;
        afis[i] %= 10;
    }

    while(t)
        afis[++afis[0]] = t % 10, t /= 10;
}

int main()
{
    for(int i = 0; i <= 2 * nr5 + 30; ++i)
        for(int j = 0; j <= 2 * nr3 + 30; ++j)
            dp[i][j] = -inf;
    dp[nr5][nr3] = 0;
    st5 = dr5 = nr5;
    st3 = dr3 = nr3;
    int n;
    fin >> n;

    for(int i = 1; i <= n; ++i)
    {
        int x, y;
        fin >> x >> y;

        int p2 = 0, p3 = 0, p5 = 0;
        while(x % 2 == 0)
            ++p2, x /= 2;
        while(x % 3 == 0)
            ++p3, x /= 3;
        while(x % 5 == 0)
            ++p5, x /= 5;

        while(y % 2 == 0)
            --p2, y /= 2;
        while(y % 3 == 0)
            --p3, y /= 3;
        while(y % 5 == 0)
            --p5, y /= 5;

        if (p5 > 0)
        {
            dr5 += p5;
            if (p3 > 0)
            {
                dr3 += p3;
                for (int i = dr5; i - p5 >= st5; i--)
                    for (int j = dr3; j - p3 >= st3; j--)
                        dp[i][j] = max(short(dp[i][j]), short(dp[i - p5][j - p3] + p2));
            }
            else
            {
                st3 += p3;
                for (int i = dr5; i - p5 >= st5; i--)
                    for (int j = st3; j - p3 <= dr3; j++)
                        dp[i][j] = max(short(dp[i][j]), short(dp[i - p5][j - p3] + p2));
            }
        }
        else
        {
            st5 += p5;
            if (p3 > 0)
            {
                dr3 += p3;
                for (int i = st5; i - p5 <= dr5; i++)
                    for (int j = dr3; j - p3 >= st3; j--)
                        dp[i][j] = max(short(dp[i][j]), short(dp[i - p5][j - p3] + p2));
            }
            else
            {
                st3 += p3;
                for (int i = st5; i - p5 <= dr5; i++)
                    for (int j = st3; j - p3 <= dr3; j++)
                        dp[i][j] = max(short(dp[i][j]), short(dp[i - p5][j - p3] + p2));
            }
        }
    }

    double rez = -1;
    int ans2 = 0, ans3 = 0, ans5 = 0;
    for(int i = 0; i <= nr5; ++i)
        for(int j = 0; j <= nr3; ++j)
        {
            int p2 = dp[i + nr5][j + nr3];
            if(p2 >= 0){
                double val = log(2.0) * p2 + log(3.0) * j + log(5.0) * i;
                if(val > rez){
                    rez = val;
                    ans2 = p2;
                    ans3 = j;
                    ans5 = i;
                }
            }
        }

    afis[0] = afis[1] = 1;
    for(int i = 1; i <= ans2; ++i)
        inmult(2);
    for(int i = 1; i <= ans3; ++i)
        inmult(3);
    for(int i = 1; i <= ans5; ++i)
        inmult(5);

    for(int i = afis[0]; i >= 1; --i)
        fout << afis[i];
    return 0;
}