Cod sursa(job #2766679)

Utilizator Alex_tz307Lorintz Alexandru Alex_tz307 Data 2 august 2021 20:23:38
Problema Aliens Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.72 kb
#include <bits/stdc++.h>

using namespace std;

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

const int MAXN = 50;
const int MAX3 = 18;
const int MAX5 = 12;
const int MAX_SUM_3 = MAXN * MAX3;
const int MAX_SUM_5 = MAXN * MAX5;
const int INF = 1e4;
const int LEN = 450;
int dp[1 + 2 * MAX_SUM_3][1 + 2 * MAX_SUM_5], p2, p3, p5, sol[LEN];

void upd(int x, int t) {
  while (x % 2 == 0) {
    p2 += t;
    x >>= 1;
  }
  while (x % 3 == 0) {
    p3 += t;
    x /= 3;
  }
  while (x % 5 == 0) {
    p5 += t;
    x /= 5;
  }
}

void max_self(int &x, int y) {
  if (x < y)
    x = y;
}

void mul(int A[], int B) {
  int i, t = 0;
  for (i = 1; i <= A[0] || t; ++i, t /= 10)
    A[i] = (t += A[i] * B) % 10;
  A[0] = i - 1;
}

int main() {
  int n;
  fin >> n;
  for (int i = 0; i <= 2 * MAX_SUM_3; ++i)
    for (int j = 0; j <= 2 * MAX_SUM_5; ++j)
      dp[i][j] = -INF;
  dp[MAX_SUM_3][MAX_SUM_5] = 0;
  int lo3, hi3, lo5, hi5;
  lo3 = hi3 = MAX_SUM_3;
  lo5 = hi5 = MAX_SUM_5;
  for (int k = 0; k < n; ++k) {
    int x, y;
    fin >> x >> y;
    p2 = p3 = p5 = 0;
    upd(x, 1);
    upd(y, -1);
    if (p3 > 0) {
      hi3 += p3;
      if (p5 > 0) {
        hi5 += p5;
        for (int i = hi3; i - p3 >= lo3; --i)
          for (int j = hi5; j - p5 >= lo5; --j)
            max_self(dp[i][j], dp[i - p3][j - p5] + p2);
      } else {
        lo5 += p5;
        for (int i = hi3; i - p3 >= lo3; --i)
          for (int j = lo5; j - p5 <= hi5; ++j)
            max_self(dp[i][j], dp[i - p3][j - p5] + p2);
      }
    } else {
      lo3 += p3;
      if (p5 > 0) {
        hi5 += p5;
        for (int i = hi3; i - p3 >= lo3; --i)
          for (int j = hi5; j - p5 >= lo5; --j)
            max_self(dp[i][j], dp[i - p3][j - p5] + p2);
      } else {
        lo5 += p5;
        for (int i = hi3; i - p3 >= lo3; --i)
          for (int j = lo5; j - p5 <= hi5; ++j)
            max_self(dp[i][j], dp[i - p3][j - p5] + p2);
      }
    }
  }
  double best = -1;
  int exp2 = 0, exp3 = 0, exp5 = 0;
  for (int i = MAX_SUM_3; i <= 2 * MAX_SUM_3; ++i)
    for (int j = MAX_SUM_5; j <= 2 * MAX_SUM_5; ++j)
      if (dp[i][j] >= 0) {
        double val = log(2) * dp[i][j] + log(3) * (i - MAX_SUM_3) + log(5) * (j - MAX_SUM_5);
        if (val > best) {
          best = val;
          exp2 = dp[i][j];
          exp3 = i - MAX_SUM_3;
          exp5 = j - MAX_SUM_5;
        }
      }
  sol[0] = sol[1] = 1;
  for (int i = 0; i < exp2; ++i)
    mul(sol, 2);
  for (int i = 0; i < exp3; ++i)
    mul(sol, 3);
  for (int i = 0; i < exp5; ++i)
    mul(sol, 5);
  for (int i = sol[0]; i > 0; --i)
    fout << sol[i];
  fout << '\n';
  fin.close();
  fout.close();
  return 0;
}