Pagini recente » Cod sursa (job #161123) | Cod sursa (job #1840937) | Cod sursa (job #1382719) | Cod sursa (job #1447676) | Cod sursa (job #782488)
Cod sursa(job #782488)
#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;
}