Ciao a tutti,
Sto provando a risolvere Bitcoin Trading
Ma non riesco a ottenere 100/100…
Credo sia un problema relativo all’arrotondamento
#pragma GCC optimize("Ofast")
#pragma GCC optimization("unroll-loops")#include <bits/stdc++.h>
#include<algorithm>
#include <string.h>
#define mod 1000000007
using namespace std;
ifstream in ("input.txt");
ofstream out("output.txt");
//input data
long n, x, s;
long double p, so = 0, q = 0;
void somma(vector < long > & v) {
vector < long > copy(v.size());
bool ck;
for (int i = 0; i < n; i++) {
if (i == 0) {
s += v[i];
ck = v[i] > 0; //TRUE: POSITIVO
} else {
if (ck) {
//finora positivi
if (v[i] < 0) {
copy.push_back(s);
s = v[i];
ck = false;
} else s += v[i];
} else {
//finora negativi
if (v[i] > 0) {
copy.push_back(s);
s = v[i];
ck = true;
} else s += v[i];
}
}
}
copy.push_back(s);
v = copy;
return;
}
int main() {
in >> n >> p;
vector < long > num(n);
for (int i = 0; i < n; i++) in >> num[i];
somma(num); //la funzione somma somma tutti i positivi consecutivi e i negativi consecutivi
if (num.front() > 0) {
//se all inizio la tendenza sarà positiva conviene comprare
q = so / p;
so = 0;
p += num.front();
} else {
//se all inizio la tendenza sarà negativa conviene vendere
so = p;
p += num.front();
q = so / p;
so = 0;
}
while (num.size() != 0) { //continua finche non finiscono i valori
if (num.front() > 0) {
//se la prossima tendenza è positiva
if (q == 0) {
//se io non ho bitcoin devo comprarli
q = so / p;
so = 0;
}
p += num.front(); //incremento il valore del bitcoin
} else {
if (q != 0) {
//se ho qualche bitcoin devo venderlo
so += q * p;
q = 0;
}
p += num.front(); //incremento il valore del bitcoin
}
num.erase(num.begin()); //cancello sempre il valore appena usato
}
if (q != 0) {
//se ho qualche bitcoin il valore del mio wallet è Q*P
out << fixed << setprecision(15) << q * p;
return 0;
}
//se non ho bitcoin vuol dire che li ho venduti poco prima ottenendo i soldi pari all'ultimo prezzo del bitcoin
out << fixed << setprecision(15) << p;
}
Il programma è relativamente veloce (credo di poter entrare in classifica)
Potreste dare un occhiata?? Grazie