Cod sursa(job #782488)

Utilizator repp4raduRadu-Andrei Szasz repp4radu Data 28 august 2012 00:54:58
Problema Minim2 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.83 kb
#include <fstream>
#include <cmath>

#define MAX 131072
#define EQL 0.000001
#define INF 0x3f3f3f3f

using namespace std;

int maxim, ind, reductions = INF, n;
double a, b, record, s, v[MAX];

bool possible(double *v, double maxim, int &add)
{
    add = 1;
    double sum = 0, mx;
    for(int i = 1; i <= n; i++)
    {
        double fraction = maxim / v[i], k = (log(fraction) / log(b));
        if(k > 0)
        {
            add += (int)k + 1;
            sum += v[i] * pow(b, (int)(k + 1));
            if(v[i] * pow(b, (int)(k + 1)) > mx) mx = v[i] * pow(b, (int)(k + 1));
        }
        else
        {
            sum += v[i];
            if(v[i] > mx) mx = v[i];
        }
    }
    sum -= mx;
    sum += mx * b;
    return sum < record;
}

void afisare(int what)
{
    ofstream out("minim2.out");
    out<<what;
    out.close();
}

int main()
{
    ifstream in("minim2.in");
    in>>n;
    for(int i = 1; i <= n; i++)
    {
        in>>v[i];
        s += v[i];
        if(v[i] > maxim) maxim = v[i], ind = i;
    }
    in>>a>>b>>record;
    in.close();
    if(record - s > 0)
    {
        afisare(0);
        return 0;
    }
    else
    {
        s -= v[ind];
        v[ind] *= a;
        s += v[ind];
        if(record - s > 0)
        {
            afisare(1);
            return 0;
        }
        else
        {
            int additional;
            double l = 1, r = record, m;
            while(l <= r)
            {
                m = (l + r) / 2;
                if(possible(v, m, additional))
                {
                    l = m + EQL;
                    reductions = min(reductions, 1 + additional);
                }
                else
                    r = m - EQL;
            }
        }
    }
    afisare(reductions);
    return 0;
}