Cod sursa(job #2610405)

Utilizator PatrickCplusplusPatrick Kristian Ondreovici PatrickCplusplus Data 4 mai 2020 20:38:33
Problema Aliens Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.03 kb
#include <bits/stdc++.h>

using namespace std;

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

const int l3 = 18 * 50, l5 = 12 * 50;

short int dp[l5 + l5 + 5 + 30][l3 + l3 + 5 + 30], inf = -30000, p, q, u, v, ans2, ans3, ans5, vv[6000];

double best = -1;


inline void inmult(short int a[], int x) {
    int transport = 0;
    for (int i = 1; i <= a[0]; ++i)
    {
        a[i] = a[i] * x + transport;
        transport = a[i] / 10;
        a[i] = a[i] % 10;
    }
    while (transport)
    {
        a[++a[0]] = transport % 10;
        transport /= 10;
    }
}

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


int main()
{
    for (int i = 0; i <= l5 + l5 + 30; ++i)
    {
        for (int j = 0; j <= l3 + l3 + 30; ++j)
        {
            dp[i][j] = inf;
        }
    }
    dp[l5][l3] = 0;
    p = q = l5;
    v = u = l3;
    int n;
    fin >> n;
    for (int i = 1; i <= n; ++i)
    {
        int x, y;
        short int p2 = 0, p3 = 0, p5 = 0;
        fin >> x >> y;
        while (x % 2 == 0) x /= 2, ++p2;
        while (x % 3 == 0) x /= 3, ++p3;
        while (x % 5 == 0) x /= 5, ++p5;

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

        if (p5 > 0) {
        q += p5;
        if (p3 > 0) {
            v += p3;
            for (int i = q; i - p5 >= p; i--)
                for (int j = v; j - p3 >= u; j--)
                    dp[i][j] = mymax(dp[i][j], dp[i - p5][j - p3] + p2);
        } else {
            u += p3;
            for (int i = q; i - p5 >= p; i--)
                for (int j = u; j - p3 <= v; j++)
                    dp[i][j] = mymax(dp[i][j], dp[i - p5][j - p3] + p2);
        }
    } else {
        p += p5;
        if (p3 > 0) {
            v += p3;
            for (int i = p; i - p5 <= q; i++)
                for (int j = v; j - p3 >= u; j--)
                    dp[i][j] = mymax(dp[i][j], dp[i - p5][j - p3] + p2);
        } else {
            u += p3;
            for (int i = p; i - p5 <= q; i++)
                for (int j = u; j - p3 <= v; j++)
                    dp[i][j] = mymax(dp[i][j], dp[i - p5][j - p3] + p2);
        }
    }
    }
    for (int i = 0; i <= l5; ++i)
    {
        for (int j = 0; j <= l3; ++j)
        {
            short int p2 = dp[i + l5][j + l3];
            if (p2 >= 0)
            {
                double val = log(2.0) * p2 + log(3.0) * j + log(5.0) * i;
                if (val > best)
                {
                    best = val;
                    ans2 = p2;
                    ans3 = j;
                    ans5 = i;
                }
            }
        }
    }
    vv[0] = 1;
    vv[1] = 1;
    for (int i = 1; i <= ans2; ++i) inmult(vv, 2);
    for (int i = 1; i <= ans3; ++i) inmult(vv, 3);
    for (int i = 1; i <= ans5; ++i) inmult(vv, 5);
    for (int i = vv[0]; i >= 1; --i) fout << vv[i];
    fin.close();
    fout.close();
    return 0;
}