Cod sursa(job #1582670)

Utilizator hrazvanHarsan Razvan hrazvan Data 28 ianuarie 2016 11:34:57
Problema Aliens Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 2.28 kb
#include <stdio.h>
#include <math.h>
#define EPS 0.0000001
#define MAXP1 400
#define MAXP2 400
#define INF 2000000000
#define MAXL 5000
int d[2][2 * MAXP1 + 1][2 * MAXP2 + 1];
int rez[MAXL], p;

inline int max2(int a, int b){
  return a > b ? a : b;
}

inline int cmp(double x, double y){
  if(x - y >= EPS)
    return 1;
  if(y - x >= EPS)
    return -1;
  return 0;
}

inline int ptr(int x, int k){
  int r = 0;
  while(x % k == 0){
    x /= k;
    r++;
  }
  return r;
}

inline void prod(int x){
  int tr = 0, i;
  for(i = 0; i < p; i++){
    rez[i] = rez[i] * x + tr;
    tr = rez[i] / 10;
    rez[i] %= 10;
  }
  while(tr > 0){
    rez[i] += tr % 10;
    tr /= 10;
    i++;
  }
  p = i;
}

int main(){
  FILE *in = fopen("aliens.in", "r");
  int n, x, y, st1 = MAXP1, dr1 = MAXP1, st2 = MAXP2, dr2 = MAXP2, a, b, c, lin, i, j, k;
  fscanf(in, "%d", &n);
  for(i = 0; i < 2 * MAXP1 + 1; i++)
    for(j = 0; j < 2 * MAXP2 + 1; j++)
      d[0][i][j] = d[1][i][j] = -INF;
  d[1][MAXP1][MAXP2] = d[0][MAXP1][MAXP2] = 0;
  for(i = 0; i < n; i++){
    lin = i & 1;
    fscanf(in, "%d%d", &x, &y);
    a = b = c = 0;
    a += ptr(x, 2) - ptr(y, 2);
    b += ptr(x, 3) - ptr(y, 3);
    c += ptr(x, 5) - ptr(y, 5);
    if(st1 > st1 + b)
      st1 += b;
    if(dr1 < dr1 + b)
      dr1 += b;
    if(st2 > st2 + c)
      st2 += c;
    if(dr2 < dr2 + c)
      dr2 += c;
    for(j = st1; j <= dr1; j++){
      for(k = st2; k <= dr2; k++){
        d[lin][j][k] = max2(d[!lin][j][k], d[!lin][j - b][k - c] + a);
      }
    }
  }
  fclose(in);
  int p1 = INF, p2 = INF;
  for(i = MAXP1; i <= dr1; i++){
    for(j = MAXP2; j <= dr2; j++){
      if(d[lin][i][j] != -INF){
        if(p1 == INF || (p1 != INF && d[lin][i][j] >= 0 && cmp(d[lin][i][j] * log(2) + (i - MAXP1) * log(3) + (j - MAXP2) * log(5), d[lin][p1][p2] * log(2) + (p1 - MAXP1) * log(3) + (p2 - MAXP2) * log(5)) == 1)){
          p1 = i;  p2 = j;
        }
      }
    }
  }
  rez[0] = 1;
  p = 1;
  while(d[lin][p1][p2] > 0){
    prod(2);
    d[lin][p1][p2]--;
  }
  for(; p1 > MAXP1; p1--)
    prod(3);
  for(; p2 > MAXP2; p2--)
    prod(5);
  FILE *out = fopen("aliens.out", "w");
  for(i = p - 1; i >= 0; i--)
    fprintf(out, "%d", rez[i]);
  fclose(out);
  return 0;
}