Pagini recente » Cod sursa (job #224622) | Cod sursa (job #2033960) | Cod sursa (job #1363284) | Cod sursa (job #1848570) | Cod sursa (job #468031)
Cod sursa(job #468031)
#include <iostream>
#include <math.h>
using namespace std;
#define maxn 100010
#define maxact 10010
#define e 0.000001
long long N, S, nract, sol, D[maxn];
long double A, B, Record, sum;
long double Bpow[maxact];
long long afla(long double ramas, long double val) {
int ls = 0, ld = 9999;
int rasp = 0;
while(ls <= ld) {
int mij = (ls + ld) >> 1;
if(ramas * Bpow[mij] - val < e) {
rasp = mij;
ld = mij - 1;
}
else {
ls = mij + 1;
}
}
return rasp;
}
int main() {
FILE *f1=fopen("minim2.in", "r"), *f2=fopen("minim2.out", "w");
int i, j, p, q;
fscanf(f1, "%lld\n", &N);
for(i=1; i<=N; i++) {
fscanf(f1, "%lld", &D[i]);
S += D[i];
}
fscanf(f1, "%llf %llf %llf", &A, &B, &Record);
Bpow[0] = 1;
for(i=1; i<maxact; i++) {
Bpow[i] = Bpow[i-1] * B;
}
int ls=0, ld = 100000000;
while(ls <= ld) {
nract = 0; sum = 0;
long double mij = (ls + ld) >> 1;
long double val = mij / 10000;
for(i=1; i<=N; i++) {
long double aux = D[i];
if(aux * (1 - A) - val > e) {
aux = aux * A;
nract++;
if(aux * (1 - B) - val > e) {
long long decite = afla(aux * (1 - B), val);
nract += decite;
aux *= Bpow[decite];
while(aux * (1 - B) - val > e) {
aux *= B;
nract++;
}
}
}
sum += aux;
}
if(sum - Record < e) {
sol = nract;
ls = (long long)mij + 1;
}
else {
ld = (long long)mij - 1;
}
}
fprintf(f2, "%lld\n", sol);
fclose(f1); fclose(f2);
return 0;
}