Cod sursa(job #2049958)

Utilizator alexandra_udristoiuUdristoiu Alexandra Maria alexandra_udristoiu Data 27 octombrie 2017 20:43:43
Problema Aliens Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.34 kb
#include<fstream>
#include<vector>
#include<cmath>
using namespace std;
int n, i, ii, j, min5, min3, u3, u5, sum3, sum5, x, y, max5, max3, p3, p5;
double sol, val;
int r[1000];
vector<int> d[1300];
struct str{
    int a, b, c;
};
str v[55];
ifstream fin("aliens.in");
ofstream fout("aliens.out");
int imp(int x, int p){
    int e = 0;
    while(x % p == 0){
        e++;
        x /= p;
    }
    return e;
}
void mult(int x){
    int i, t = 0;
    for(i = 1; i <= r[0]; i++){
        r[i] = r[i] * x + t;
        t = r[i] / 10;
        r[i] %= 10;
    }
    while(t != 0){
        r[ ++r[0] ] = t % 10;
        t /= 10;
    }
}
int main(){
    fin>> n;
    for(i = 1; i <= n; i++){
        fin>> x >> y;
        v[i].a = imp(x, 2) - imp(y, 2);
        v[i].b = imp(x, 3) - imp(y, 3);
        v[i].c = imp(x, 5) - imp(y, 5);
        if(v[i].b < 0){
            min3 -= v[i].b;
        }
        else{
            max3 += v[i].b;
        }
        if(v[i].c < 0){
            min5 -= v[i].c;
        }
        else{
            max5 += v[i].c;
        }
    }
    for(i = 0; i <= min5 + max5; i++){
        for(j = 0; j <= min3 + max3; j++){
            d[i].push_back(-1000000);
        }
    }
    d[min5][min3] = 0;
    for(ii = 1; ii <= n; ii++){
        for(i = u5 + min5; i >= p5 + min5; i--){
            for(j = u3 + min3; j >= p3 + min3; j--){
                d[i + v[ii].c ][j + v[ii].b ] = max(d[i + v[ii].c ][j + v[ii].b ], d[i][j] + v[ii].a);
            }
        }
        u3 = max(u3, u3 + v[ii].b);
        p3 = min(p3, p3 + v[ii].b);
        u5 = max(u5, u5 + v[ii].c);
        p5 = min(p5, p5 + v[ii].c);
    }
    for(i = min5; i <= min5 + max5; i++){
        for(j = min3; j <= min3 + max3; j++){
            if(d[i][j] >= 0){
                val = log(2) * d[i][j] + log(3) * (j - min3) + log(5) * (i - min5);
                if(val > sol){
                    val = sol;
                    x = i;
                    y = j;
                }
            }
        }
    }
    r[0] = r[1] = 1;
    for(i = 1; i <= d[x][y]; i++){
        mult(2);
    }
    x -= min5;
    y -= min3;
    for(i = 1; i <= y; i++){
        mult(3);
    }
    for(i = 1; i <= x; i++){
        mult(5);
    }
    for(i = r[0]; i >= 1; i--){
        fout<< r[i];
    }
    fout<<"\n";
    return 0;
}